Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 перечисление множества таблиц в запросе  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2761
Добрый день!

Есть множество однотипных таблиц с наименованием mmyyy&"b1" (mm - месяц, yyyy - год), пример ниже (012008b1 и 012009b1).

Таблица 012008b1
REGNBAL
138
240
342
966

Таблица 012009b1
REGNBAL
138
240
966
1061

Мне необходимо свести все эти таблицы к следующему виду

Искомая таблица
REGN012008b1012009b1
13838
24040
342null
96666
10null61
*вместо null может быть что угодно, это не принципиально.

Два вопроса
-как это сделать?
-как компактно запихать в запрос множество таблиц? их около сорока, есть ли способ не перечислять все? мб какой-то мастер.

PS знаю про PIVOT, но как-то не выходит правильно
PPS подгружать данные прямо в сводную таблицу Excel в соответствии со справкой MS (ссылка) не получилось - у меня отсутствует контролл "Разрешить выбор нескольких таблиц" из п.5. М.б. дело в express версии sql?

+ select @@version
Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (Intel X86) Dec 28 2012 19:06:41 Copyright (c) Microsoft Corporation Express Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
31 июл 13, 11:06    [14641561]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Glory
Member

Откуда:
Сообщений: 104760
PlanB
-как это сделать?

Изучить типы JOIN-ов. Выбрать нужный

PlanB
-как компактно запихать в запрос множество таблиц? их около сорока, есть ли способ не перечислять все? мб какой-то мастер.

Мастер называется руки. Можно мышкой перетаскать нужные таблицы из списка таблиц в окно запроса
31 июл 13, 11:09    [14641574]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2761
ок, вот мой шедевр. может, все-таки, проще можно как-то?

SELECT DISTINCT 
a.regn, 
b.dt as [012008b1], 
c.dt as [012009b1], 
d.dt as [012010b1], 
e.dt as [012011b1], 
f.dt as [012012b1], 
g.dt as [012013b1]
FROM
((((((SELECT * FROM [dbo].[012008b1]
UNION
SELECT * FROM [dbo].[012009b1]
UNION
SELECT * FROM [dbo].[012010b1]
UNION
SELECT * FROM [dbo].[012011b1]
UNION
SELECT * FROM [dbo].[012012b1]
UNION
SELECT * FROM [dbo].[012013b1]) a
join [dbo].[012008b1] b on a.regn = b.regn)
join [dbo].[012009b1] c on a.regn = c.regn)
join [dbo].[012010b1] d on a.regn = d.regn)
join [dbo].[012011b1] e on a.regn = e.regn)
join [dbo].[012012b1] f on a.regn = f.regn)
join [dbo].[012012b1] g on a.regn = g.regn
31 июл 13, 11:34    [14641746]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2761
уже 15 минут считает, все никак..
31 июл 13, 11:47    [14641848]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
PlanB
ок, вот мой шедевр. может, все-таки, проще можно как-то?

А что оно работает как надо? Может лучше full join соединить все таблицы ?
31 июл 13, 11:48    [14641862]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2761
Мистер Хенки
PlanB
ок, вот мой шедевр. может, все-таки, проще можно как-то?

А что оно работает как надо? Может лучше full join соединить все таблицы ?
не знаю еще, 20 минут как кота шредингера вспоминаю..
31 июл 13, 11:51    [14641890]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31481
PlanB
ок, вот мой шедевр. может, все-таки, проще можно как-то?
Зачем выборка с union???

Просто делаете 
b.regn, 
b.dt as [012008b1], 
c.dt as [012009b1], 
d.dt as [012010b1], 
e.dt as [012011b1], 
f.dt as [012012b1], 
g.dt as [012013b1]
FROM [dbo].[012008b1] b
join [dbo].[012009b1] c on a.regn = c.regn
join [dbo].[012010b1] d on a.regn = d.regn
join [dbo].[012011b1] e on a.regn = e.regn
join [dbo].[012012b1] f on a.regn = f.regn
join [dbo].[012013b1] g on a.regn = g.regn

Не говоря о том, что у вас в запросе синтаксическая и логическая ошибка, вы наверное всё таки другой запрос запускали.

Плюс у вас там CROSS JOIN, так что запрос будет выполняться бесконечно, пока сервер не упадёт.

Внимательнее надо...
31 июл 13, 11:52    [14641899]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2761
alexeyvg, нужны все записи из поля регн по всем таблицам. в одной [012008b1] все записи точно не содержатся. или и так прявильно?
31 июл 13, 11:54    [14641917]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31481
alexeyvg
Плюс у вас там CROSS JOIN, так что запрос будет выполняться бесконечно, пока сервер не упадёт.
А, нет, показалось, что условие g.regn = g.regn

SELECT
    b.regn, 
    b.dt as [012008b1], 
    c.dt as [012009b1], 
    d.dt as [012010b1], 
    e.dt as [012011b1], 
    f.dt as [012012b1], 
    g.dt as [012013b1]
FROM [dbo].[012008b1] b
join [dbo].[012009b1] c on b.regn = c.regn
join [dbo].[012010b1] d on b.regn = d.regn
join [dbo].[012011b1] e on b.regn = e.regn
join [dbo].[012012b1] f on b.regn = f.regn
join [dbo].[012013b1] g on b.regn = g.regn
31 июл 13, 11:55    [14641926]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31481
PlanB
alexeyvg, нужны все записи из поля регн по всем таблицам. в одной [012008b1] все записи точно не содержатся. или и так прявильно?
А, понятно.

Но ваш запрос это не выдаст, вы же делаете JOIN по регн для каждой таблицы

Тогда так:
SELECT
    COALESCE(b.regn, c.regn, d.regn, e.regn, f.regn, g.regn) as regn,
    b.dt as [012008b1], 
    c.dt as [012009b1], 
    d.dt as [012010b1], 
    e.dt as [012011b1], 
    f.dt as [012012b1], 
    g.dt as [012013b1]
FROM [dbo].[012008b1] b
  full join [dbo].[012009b1] c on b.regn = c.regn
  full join [dbo].[012010b1] d on b.regn = d.regn
  full join [dbo].[012011b1] e on b.regn = e.regn
  full join [dbo].[012012b1] f on b.regn = f.regn
  full join [dbo].[012013b1] g on b.regn = g.regn
31 июл 13, 11:57    [14641950]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Гость333
Member

Откуда:
Сообщений: 3683
alexeyvg
в запросе ... синтаксическая ошибка

Где именно синтаксическая ошибка?
31 июл 13, 12:04    [14641995]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2761
alexeyvg, что-то не получается у него.. в смысле, я ожидал увидеть данные без повторений. корме того, считает очень долго, еще не извлек все

regn012008b1012009b1012010b1012011b1012012b1012013b1
32008-02-01NULLNULLNULLNULLNULL
32008-02-01NULLNULLNULLNULLNULL
32008-02-01NULLNULLNULLNULLNULL
32008-02-01NULLNULLNULLNULLNULL
32008-02-01NULLNULLNULLNULLNULL
32008-02-01NULLNULLNULLNULLNULL
32008-02-01NULLNULLNULLNULLNULL
32008-02-01NULLNULLNULLNULLNULL
32008-02-01NULLNULLNULLNULLNULL
31 июл 13, 12:14    [14642089]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
PlanB
alexeyvg, что-то не получается у него.. в смысле, я ожидал увидеть данные без повторений. корме того, считает очень долго, еще не извлек все

если regn не первичный ключ и не уникален, тогда непонятно что вы ищете. Уточняйте требуемый результат
31 июл 13, 12:20    [14642130]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2761
Мистер Хенки
если regn не первичный ключ и не уникален, тогда непонятно что вы ищете. Уточняйте требуемый результат
в смысле, не уникален? конечно нет! в первом посте все изложил, куда уж нагляднее?!
31 июл 13, 12:21    [14642141]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
ну, привет
Guest
PlanB
Мистер Хенки
если regn не первичный ключ и не уникален, тогда непонятно что вы ищете. Уточняйте требуемый результат
в смысле, не уникален? конечно нет! в первом посте все изложил, куда уж нагляднее?!

и где же это в первом посте regn повторяется, в какой из таблиц?
31 июл 13, 12:24    [14642162]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Glory
Member

Откуда:
Сообщений: 104760
PlanB
в смысле, не уникален? конечно нет! в первом посте все изложил, куда уж нагляднее?!

В первом сообщение как раз ваш REGN уникален
31 июл 13, 12:25    [14642167]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PlanB
PS знаю про PIVOT, но как-то не выходит правильно

А если так попробовать?
declare @012008b1 table (regn int, bal money);

insert @012008b1(regn, bal)
select 1, 38 union all select 2, 40 union all select 3, 42 union all select 9, 66;

declare @012009b1 table (regn int, bal money);

insert @012009b1(regn, bal)
select 1, 38 union all select 2, 40 union all select 9, 66 union all select 10, 61;

declare @012010b1 table (regn int, bal money);

insert @012010b1(regn, bal)
select 1, 37 union all select 3, 38 union all select 10, 86 union all select 20, 99;

select *
from
(
   select regn, bal, '012008b1' table_name from @012008b1
   union all
   select regn, bal, '012009b1' table_name from @012009b1
   union all
   select regn, bal, '012010b1' table_name from @012010b1
) t
pivot (min(bal) for table_name in ([012008b1], [012009b1], [012010b1])) as pvt;
31 июл 13, 12:28    [14642182]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
ElenHim
Member

Откуда: Москва
Сообщений: 204
PlanB,

SELECT REGN, BAL,  '012008b1' Tbl FROM dbo.012009b1
UNION
SELECT REGN, BAL,  '012008b2' Tbl FROM dbo.012009b2
UNION
....
....
SELECT REGN, BAL,  '012008bN' Tbl FROM dbo.012009bN


Можно сделать вьюху или хп на сервере, либо запросом в коннекте сводной таблицы сохранить.
31 июл 13, 12:32    [14642211]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PlanB
Есть множество однотипных таблиц с наименованием mmyyy&"b1" (mm - месяц, yyyy - год), пример ниже (012008b1 и 012009b1).

Мне вот всегда интересно, зачем так именовать? :)
Разные года идут вперемешку — январь 2008, январь 2009, январь 2010, февраль 2008, февраль 2009, февраль 2010...
Почему не назвать yyyymm&"b1"?
31 июл 13, 12:38    [14642241]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Гость333,

я бы даже спросил - почему год и месяц не вынести в отдельное поле и не хранить бы все в одной таблице :)?
Все равно к этому и пришли...
31 июл 13, 12:42    [14642252]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4728
PlanB,

40 таблиц ---увы , не потянет
Запрос
АтрибутМаксимальное значение
Число установленных связей32 на одну таблицу за вычетом числа индексов, находящихся в таблице для полей или сочетаний полей, не участвующих в связях
Число таблиц в запросе32*
Число объединений в запросе16*
Число полей в наборе записей255
Размер набора записей1 Гбайт
Предел сортировки255 знаков в одном или нескольких полях
Число уровней вложения запросов50*
Число знаков в ячейке на бланке запроса1024
Число знаков для параметра в запросе с параметрами255
Число операторов AND в предложении WHERE или HAVING99*
Число знаков в инструкции SQLприблизительно 64 000*
31 июл 13, 12:45    [14642263]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Cygapb-007
я бы даже спросил - почему год и месяц не вынести в отдельное поле и не хранить бы все в одной таблице :)?

Ну, например, горизонтальное секционирование данных. Хотя, судя по всему, здесь далеко не те объёмы, для которых это может понадобиться :)

ПЕНСИОНЕРКА
Число знаков в ячейке на бланке запроса

Да уж... "Ячейка бланка запроса" — прямо перфокарта какая-то...
Тут вообще-то форум по MSSQL, а не по Access :)
31 июл 13, 12:51    [14642297]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4728
PlanB,

так что единственный вариант

--форма для выбора таблиц из tabledefs или dir
--рабочая таблица
--очистка рабочей
--вставка выбранного c переворотом даты
insert into rab1(regn, bal,zname)
select regn, bal, '2008 01 b1' table_name from @012008b1
--и на закуску -- перекрестный
31 июл 13, 12:51    [14642299]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4728
Гость333,

просмотрела имя форума, старость не радость
-----
но алгоритм не зависит от форума
31 июл 13, 12:53    [14642312]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2761
Glory
PlanB
в смысле, не уникален? конечно нет! в первом посте все изложил, куда уж нагляднее?!

В первом сообщение как раз ваш REGN уникален
не уникален во множестве таблиц.
31 июл 13, 13:04    [14642386]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2761
Гость333
PlanB
Есть множество однотипных таблиц с наименованием mmyyy&"b1" (mm - месяц, yyyy - год), пример ниже (012008b1 и 012009b1).

Мне вот всегда интересно, зачем так именовать? :)
Разные года идут вперемешку — январь 2008, январь 2009, январь 2010, февраль 2008, февраль 2009, февраль 2010...
Почему не назвать yyyymm&"b1"?
я двумя руками за! это к Банку России вопросы
31 июл 13, 13:05    [14642395]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
PlanB
Glory
пропущено...

В первом сообщение как раз ваш REGN уникален
не уникален во множестве таблиц.

тогда стоит описать закономерность соединения всех таблиц по regn , т.е. если мы имеем несколько записей с одинаковыми regn но разными данными, то что должно попасть в результирующую таблицу.
31 июл 13, 13:12    [14642453]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Glory
Member

Откуда:
Сообщений: 104760
PlanB
Glory
пропущено...

В первом сообщение как раз ваш REGN уникален
не уникален во множестве таблиц.

И как же соединение по уникальному ключу может дать неуникальный набор ?
31 июл 13, 13:17    [14642491]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
select 1 as regn, 38  as bal into #012008b1
union all select 2, 40 union all select 3, 42 union all select 9, 66

select 1 as regn, 38  as bal into #012009b1
union all select 2, 40 union all select 9, 66 union all select 10, 61;

select 1 as regn, 37  as bal into #012010b1
union all select 3, 38 union all select 10, 86 union all select 20, 99;


declare @tablename varchar(100)
create table _result (regn int )

declare circle cursor local for
select '#012008b1' as TableName 
union select '#012009b1'
union select '#012010b1'
-- все таблицы
open circle
fetch next from circle into @tablename
while @@fetch_status =0
	begin
		exec ('alter table _result add ' +	@tablename + ' int')
		exec ('INSERT INTO _result(regn,'+@tablename+')  select regn,bal from '+@tablename+' t '
		+' where not exists (select * from _result where regn = t.regn)')
		exec ('update r set r.'+@tablename+'=t.bal from _result r JOIN '+@tablename+' t '
		+' on r.regn = t.regn')
		fetch next from circle into @tablename
	end
close	circle

select * from _result
if OBJECT_ID('_result') is not null drop table _result
31 июл 13, 13:41    [14642690]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31481
Гость333
alexeyvg
в запросе ... синтаксическая ошибка

Где именно синтаксическая ошибка?
У join-ов закрувающие скобки лишние
31 июл 13, 14:05    [14642911]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31481
PlanB
alexeyvg, что-то не получается у него.. в смысле, я ожидал увидеть данные без повторений. корме того, считает очень долго, еще не извлек все
Я думаю, вы просто неправильно переписали мой запрос.

Вылоджите его сюда, только без редактирования, прямо как он выполняется.
31 июл 13, 14:07    [14642928]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31481
alexeyvg
Гость333
пропущено...

Где именно синтаксическая ошибка?
У join-ов закрувающие скобки лишние
А, там же написано FROM ((((((SELECT

Шедевр, конечно :-)
31 июл 13, 14:08    [14642941]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Гость333
Member

Откуда:
Сообщений: 3683
alexeyvg,

Ваш запрос с фулджойнами всё равно не совсем корректен, надо типа такого:
SELECT
    COALESCE(b.regn, c.regn, d.regn, e.regn, f.regn, g.regn) as regn,
    b.dt as [012008b1], 
    c.dt as [012009b1], 
    d.dt as [012010b1], 
    e.dt as [012011b1], 
    f.dt as [012012b1], 
    g.dt as [012013b1]
FROM [dbo].[012008b1] b
  full join [dbo].[012009b1] c on b.regn = c.regn
  full join [dbo].[012010b1] d on d.regn = coalesce(b.regn, c.regn)
  full join [dbo].[012011b1] e on e.regn = coalesce(b.regn, c.regn, d.regn)
  full join [dbo].[012012b1] f on f.regn = coalesce(b.regn, c.regn, d.regn, e.regn)
  full join [dbo].[012013b1] g on g.regn = coalesce(b.regn, c.regn, d.regn, e.regn, f.regn)

Ну и сам подход — джойн 40 таблиц — далеко не самый оптимальный.
31 июл 13, 14:21    [14643040]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
сургей
Member

Откуда:
Сообщений: 5
select *
from
(
select *,'012008b1' [name] from dbo.[012008b1]
union
select *,'012009b1' from dbo.[012009b1]
union
select *,'012010b1' from dbo.[012010b1]
) t
pivot
(min(t.bal)
for [name] in ([012008b1],[012009b1],[012010b1])
)pv
31 июл 13, 16:00    [14643822]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
сургей
Member

Откуда:
Сообщений: 5
Сорри дубликат Гость333. Не заметил!!!
31 июл 13, 16:12    [14643918]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
сургей
Member

Откуда:
Сообщений: 5
;with reg
as
(select regn from dbo.[012008b1] 
union
select regn from dbo.[012009b1]
union
select regn from dbo.[012010b1]
)
select 
rg.*
,t1.[012008b1]
,t2.[012009b1]
,t3.[012010b1]
from reg rg
left join (select regn,bal [012008b1] from dbo.[012008b1]) as t1 on t1.regn=rg.regn
left join (select regn,bal [012009b1] from dbo.[012009b1]) as t2 on t2.regn=rg.regn
left join (select regn,bal [012010b1] from dbo.[012010b1]) as t3 on t3.regn=rg.regn
31 июл 13, 16:58    [14644256]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31481
Гость333
Ваш запрос с фулджойнами всё равно не совсем корректен, надо типа такого:
Да, лоханулся, забыл про условия :-(
Гость333
Ну и сам подход — джойн 40 таблиц — далеко не самый оптимальный.
Да, может PIVOT и лучше.
31 июл 13, 17:15    [14644357]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2761
Добрый день!

По причине того, что ни один из запросов, опубликованных выше не выдавал того, что я ждал, я принял решение сократить набор данных с 80 таблиц до 21 (на тесты взял квартальные данные) и разбил все на два этапа.

1) при помощи запроса под спойлером "1" (гениальный код, не правда ли) я создал таблицу [REGN_DIST] с единственным столбцом REGN - всего 1090 строк.

REGN
1
5
18
...
+ 1
--КВАРТАЛЬНЫЕ ДАННЫЕ ПО БАНКАМ--
SELECT DISTINCT a.regn FROM
(
select regn, dt from [dbo].[122007b1] union all --2008-01-01
select regn, dt from [dbo].[122008b1] union all --2009-01-01
select regn, dt from [dbo].[122009b1] union all --2010-01-01
select regn, dt from [dbo].[122010b1] union all --2011-01-01
select regn, dt from [dbo].[122011b1] union all --2012-01-01
select regn, dt from [dbo].[122012b1] union all --2013-01-01 <--

select regn, dt from [dbo].[032008b1] union all --2008-04-01
select regn, dt from [dbo].[032009b1] union all --2009-04-01
select regn, dt from [dbo].[032010b1] union all --2010-04-01
select regn, dt from [dbo].[032011b1] union all --2011-04-01
select regn, dt from [dbo].[032012b1] union all --2012-04-01

select regn, dt from [dbo].[062008b1] union all --2008-07-01
select regn, dt from [dbo].[062009b1] union all --2009-07-01
select regn, dt from [dbo].[062010b1] union all --2010-07-01
select regn, dt from [dbo].[062011b1] union all --2011-07-01
select regn, dt from [dbo].[062012b1] union all --2012-07-01

select regn, dt from [dbo].[092008b1] union all --2008-10-01
select regn, dt from [dbo].[092009b1] union all --2009-10-01
select regn, dt from [dbo].[092010b1] union all --2010-10-01
select regn, dt from [dbo].[092011b1] union all --2011-10-01
select regn, dt from [dbo].[092012b1] --2012-10-01
) a 
ORDER BY 1

2) я попытался обычными джоинами прикрапить к [REGN_DIST] остальные таблицы. Итого кодом под спойлером 2 выгружается то, что надо за 23 сек. Спойлер 3 содержит код, который мой сервер переварить уже не может (терпение лопнуло через 7 минут). что делать-то?? мне надо туда 18 таблиц приписать, а он три не может.

regn2008-01-012008-04-01
111
2NULLNULL
333
5NULLNULL
18NULLNULL
212121
232323
+ 2
SELECT DISTINCT
a.regn, 
b.regn AS '2008-01-01',
c.regn AS '2008-04-01'
FROM [dbo].[REGN_DIST] a
LEFT OUTER JOIN [dbo].[122007b1] b ON a.regn = b.regn
LEFT OUTER JOIN [dbo].[032008b1] c ON a.regn = c.regn
ORDER BY 1
+ 3
SELECT DISTINCT
a.regn, 
b.regn AS '2008-01-01',
c.regn AS '2008-04-01',
d.regn AS '2008-07-01'
FROM [dbo].[REGN_DIST] a
LEFT OUTER JOIN [dbo].[122007b1] b ON a.regn = b.regn
LEFT OUTER JOIN [dbo].[032008b1] c ON a.regn = c.regn
LEFT OUTER JOIN [dbo].[062008b1] d ON a.regn = d.regn
ORDER BY 1
Всем заранее спасибо за ответы!
5 авг 13, 14:26    [14664118]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4728
PlanB,

40 ТАБЛИЦ
1190 REGN
-----------
а по скольку записей в таблицах
каковы значения regn-max /regn-min
5 авг 13, 15:48    [14664871]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Небольшое дополнение к ранее высказанным советам (предварительная аггрегация):
-- if object_id('tempdb..#012008b1') is not null drop table #012008b1,#012009b1,#012010b1
if object_id('tempdb..#012008b1') is null begin
   create table #012008b1 (RegN int, Bal money);
   create index #012008b1_idx on #012008b1(RegN) include(Bal);
   insert #012008b1 values(1,10),(2,10),(2,5);

   create table #012009b1 (RegN int, Bal money);
   create index #012009b1_idx on #012009b1(RegN) include(Bal);
   insert #012009b1 values(1,15),(3,20),(4,20);

   create table #012010b1 (RegN int, Bal money);
   create index #012010b1_idx on #012010b1(RegN) include(Bal);
   insert #012010b1 values(2,10),(2,5),(2,7),(4,30);
end

select bank,
   RegN,d0801[2008-01],d0901[2009-01],d1001[2010-01]
from(
   select 'Название банка1', 'd0801', RegN, sum(bal) from #012008b1 group by RegN union all
   select 'Название банка1', 'd0901', RegN, sum(bal) from #012009b1 group by RegN union all
   select 'Название банка1', 'd1001', RegN, sum(bal) from #012010b1 group by RegN 
   )u(bank,dt,RegN,bal)
pivot(sum(bal) for dt in (d0801,d0901,d1001))p
order by bank,RegN
bankRegN2008-012009-012010-01
Название банка1110.000015.0000NULL
Название банка1215.0000NULL22.0000
Название банка13NULL20.0000NULL
Название банка14NULL20.000030.0000
5 авг 13, 15:50    [14664889]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2761
ПЕНСИОНЕРКА
PlanB,

40 ТАБЛИЦ
1190 REGN

-----------
а по скольку записей в таблицах
каковы значения regn-max /regn-min


REGN - это четырехзначный номер. изменяется от 1 до ~3500
Колличество строк в таблицах от 134 тыс в самой ранней до 170 тыс. в самой поздней.
Колличество столбцов - по 18 штук
5 авг 13, 16:03    [14664981]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Alexander Us
Member

Откуда:
Сообщений: 1133
PlanB,

А Вам действительно надо разворачивать (PIVOT) таблицы непосредственно на SQL сервере ?

Если конечная цель это: отчёт в Экселе
и
Ваши юзеры используют версию Элсель от 2007 и выше,
посмотрите в сторону бесплатной библиотеки EPPlus.
Там легко делается (в Экселе) пивот.

В таком случае на SQL Server будет достаточно констрцукции вида
select a,b,c, 'tab1' Tab from tab1
union
select a,b,c, 'tab2' Tab from tab2
union
select a,b,c, 'tab3' Tab from tab3
5 авг 13, 16:33    [14665130]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4728
PlanB,

REGN 012008b1 012009b1
1 38 38
2 40 40
3 42 null
9 66 66
10 null 61


вначале было показано 1 столбец на таблицу
теперь-----------------------------------------18

что еще
5 авг 13, 17:11    [14665356]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4728
PlanB,

вариант из а2007

Код1regnbal
21100
32200
43300
59900
t2
Код2regnbal
21100
32200
43300
59900
6212100
t3
Код3regnbal
21100
32200
43300
59900
6313100
t4
Код4regnbal
21100
32200
43300
59900
6414100
7424200
t5
Код5regnbal
21100
32200
43300
59900
641100
7515100
tregn
Код_ tregn regnz1z2z3z4z5
421100100100100100
432200200200200200
443300300300300300
459900900900900900
46212100
47313100
48414100100
49424200
50515100


Option Compare Database
Option Explicit

Dim dbs As DAO.Database
Dim rst1r As DAO.Recordset
Dim rst1w As DAO.Recordset
Dim jtab, j1, j1k, j2, j2k, s1, s2
Dim xm, x1n, x1k
Sub m130805_1603()
xm = Array("t1", "t2", "t3", "t4", "t5")
x1n = LBound(xm, 1)
x1k = UBound(xm, 1)

Set dbs = CurrentDb
s1 = "delete * from tregn"
DoCmd.RunSQL s1
Set rst1w = dbs.OpenRecordset("select * from tregn")


Do While x1n <= x1k
s1 = "select regn as zregn,sum(bal) as zbal from " & xm(x1n) & " group by regn"
Debug.Print x1n, s1

Set rst1r = dbs.OpenRecordset(s1)
Do While rst1r.EOF = False
s2 = rst1r!zregn
Debug.Print s2;
rst1w.FindFirst "regn=" & s2
If rst1w.NoMatch = True Then
rst1w.AddNew
rst1w.Fields("regn") = s2
rst1w.Fields(x1n + 2).Value = rst1r.Fields("zbal")
rst1w.Update
Else
rst1w.Edit
'rst1!regn = s2
rst1w.Fields(x1n + 2).Value = rst1r.Fields("zbal")
rst1w.Update
End If
rst1r.MoveNext
Loop
rst1r.Close
x1n = x1n + 1
Loop
rst1w.Close
Set rst1r = Nothing
Set rst1w = Nothing
Set dbs = Nothing

'rstEmployees.FindFirst "HireDate > #" & Format(mydate, 'm-d-yy' ) & "#"


End Sub
5 авг 13, 17:20    [14665409]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2761
Alexander Us
PlanB... посмотрите в сторону бесплатной библиотеки EPPlus.
боюсь excel такое не переварит. более того, у меня ощущение, что сервер даже не сведет все таблицы юнионами
6 авг 13, 09:27    [14667454]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PlanB
ни один из запросов, опубликованных выше не выдавал того, что я ждал

Тема несоответствия ожиданиям не раскрыта. Почему, например, не подошёл запрос с union all и pivot?
6 авг 13, 09:41    [14667538]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2761
Гость333
PlanB
ни один из запросов, опубликованных выше не выдавал того, что я ждал

Тема несоответствия ожиданиям не раскрыта. Почему, например, не подошёл запрос с union all и pivot?
потому, что у меня зависает сервак
6 авг 13, 11:15    [14668104]     Ответить | Цитировать Сообщить модератору
 Re: перечисление множества таблиц в запросе  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
PlanB
Гость333
пропущено...

Тема несоответствия ожиданиям не раскрыта. Почему, например, не подошёл запрос с union all и pivot?
потому, что у меня зависает сервак
Можете показать предполагаемый план выполнения этого запроса?
6 авг 13, 11:23    [14668165]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft SQL Server Ответить