Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 перечисление множества таблиц в запросе  [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
Сообщений: 31420
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
Сообщений: 31420
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
Сообщений: 31420
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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить