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

Откуда:
Сообщений: 125
Здравствуйте!
Есть 6 разных таблиц с одинаковым полем AFFECTED_ITEM
Необходимо вывести колонку AFFECTED_ITEM и Count по каждой таблице



К примеру

AFFECTED_ITEM | Table1 | Table2 | Table3 | Table6 |
--------------------------------------------------------------
Item1 | 53 | 45 | 12 | 0 |
--------------------------------------------------------------
Item2 | 4 | 13 | 77 | 9 |
--------------------------------------------------------------
Item3 | 7 | 0 | 24 | 23 |
17 апр 17, 08:42    [20406485]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
Добрый Э - Эх
Guest
Marin_1a,

возможные варианты:
1) предварительная группировка по каждой таблице + последующее внешнее соединение результатов в единый датасет
2) предварительная группировка по каждой таблице + union all результатов + PIVOT полученного объединения
17 апр 17, 08:58    [20406506]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
Marin_1a
Есть 6 разных таблиц с одинаковым полем AFFECTED_ITEM
Необходимо вывести колонку AFFECTED_ITEM и Count по каждой таблице
6 full join
или
6 union + pivot
17 апр 17, 08:59    [20406512]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
Marin_1a
Member

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

Подсказали сделать так:
SELECT
t.AFFECTED_ITEM,
Table1,
Table2,
...
FROM (
SELECT DISTINCT AFFECTED_ITEM FROM Table1
UNION
SELECT DISTINCT AFFECTED_ITEM FROM Table2
UNION
...
) t
LEFT JOIN (select AFFECTED_ITEM, count(AFFECTED_ITEM) as Table1 from Table1 group by AFFECTED_ITEM) as t1 ON t.AFFECTED_ITEM = t1.AFFECTED_ITEM
LEFT JOIN (select AFFECTED_ITEM, count(AFFECTED_ITEM) as Table2 from Table2 group by AFFECTED_ITEM) as t2 ON t.AFFECTED_ITEM = t2.AFFECTED_ITEM
...
ORDER BY t.AFFECTED_ITEM


но теперь не получается добавить @Parameters

к примеру
WHERE OPEN_TIME between @StartDate and @EndDate + 1
and COMPANY in @Company
17 апр 17, 12:32    [20407257]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
Владислав Колосов
Member

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

пишите имена таблиц в указании полей.
17 апр 17, 12:53    [20407338]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
Marin_1a
Подсказали сделать так:
Да, можно и так...

Marin_1a
но теперь не получается добавить @Parameters

к примеру
WHERE OPEN_TIME between @StartDate and @EndDate + 1
and COMPANY in @Company
А что не получается?
В каждом JOINе добавляете:
LEFT JOIN (select AFFECTED_ITEM, count(AFFECTED_ITEM) as Table2 
           from Table2 WHERE OPEN_TIME between @StartDate and @EndDate  + 1 
           group by AFFECTED_ITEM) as t2 ON t2.AFFECTED_ITEM = t1.AFFECTED_ITEM

PS Конструкция "COMPANY in @Company" выглядит странно.
17 апр 17, 14:59    [20407890]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20974
SELECT DISTINCT ...
UNION
SELECT DISTINCT ...
Дурь...
17 апр 17, 15:53    [20408054]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
Akina
SELECT DISTINCT ...
UNION
SELECT DISTINCT ...

Дурь...
Это да...

Вообще самый оптимальный вариант для такой задачи - UNION ALL + PIVOT

SELECT AFFECTED_ITEM, Table1, Table2, ...
FROM (
    select 'Table1' as Tab, AFFECTED_ITEM, count(*) as AFFECTED_ITEMS from Table1 group by AFFECTED_ITEM
    union all
    select 'Table2' as Tab, AFFECTED_ITEM, count(*) as AFFECTED_ITEMS from Table1 group by AFFECTED_ITEM
    ...
) t
PIVOT (
    SUM(AFFECTED_ITEMS) FOR Tab IN(Table1, Table2, ...)
) as p


PS Условия добавлять в каждый внутренний select
17 апр 17, 16:29    [20408218]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
Klick
Member

Откуда: Стерлитамак - Москва
Сообщений: 1023
Marin_1a,

Эту задачу матричный отчет в SSRS решает на раз два. У вас же репортинг как раз. Пользуйтесь его возможностями.
17 апр 17, 20:29    [20408914]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
Marin_1a
Member

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

Спасибо! Получилось, как требовалось.
18 апр 17, 07:13    [20409400]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
Marin_1a
Member

Откуда:
Сообщений: 125
alexeyvg
Akina
SELECT DISTINCT ...
UNION
SELECT DISTINCT ...

Дурь...
Это да...

Вообще самый оптимальный вариант для такой задачи - UNION ALL + PIVOT

SELECT AFFECTED_ITEM, Table1, Table2, ...
FROM (
    select 'Table1' as Tab, AFFECTED_ITEM, count(*) as AFFECTED_ITEMS from Table1 group by AFFECTED_ITEM
    union all
    select 'Table2' as Tab, AFFECTED_ITEM, count(*) as AFFECTED_ITEMS from Table1 group by AFFECTED_ITEM
    ...
) t
PIVOT (
    SUM(AFFECTED_ITEMS) FOR Tab IN(Table1, Table2, ...)
) as p


PS Условия добавлять в каждый внутренний select




Тогда в этом случае вторую колонку уже не добавишь?
Если мне нужно помимо AFFECTED_ITEM вынести еще один столбец SUBCATEGORY
18 апр 17, 09:27    [20409669]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
Klick
Member

Откуда: Стерлитамак - Москва
Сообщений: 1023
Marin_1a
Тогда в этом случае вторую колонку уже не добавишь?
Если мне нужно помимо AFFECTED_ITEM вынести еще один столбец SUBCATEGORY


Делайте отчет в SSRS. Это задача для него. Там сможете добавить сколько угодно столбцов. Матричный отчет все умеет сам делать.
18 апр 17, 11:24    [20410067]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
Marin_1a
Member

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

А если нужно будет построить без него?
Совсем никак?
18 апр 17, 12:00    [20410251]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Marin_1a,

https://www.google.com.ua/search?q=pivot multiple columns sql server&oq=pivot multiple columns sql server&gs_l=serp.12..0i7i30k1j0j0i30k1l3j0i8i30k1l5.1203.1975.0.5180.4.4.0.0.0.0.131.434.1j3.4.0....0...1c.1.64.serp..0.3.344...30i10k1j0i13k1j0i8i7i30k1.lIq3rOVIZ-Q
18 апр 17, 12:01    [20410255]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
Marin_1a
Тогда в этом случае вторую колонку уже не добавишь?
Если мне нужно помимо AFFECTED_ITEM вынести еще один столбец SUBCATEGORY
Ещё можно так: https://www.sql.ru/forum/1247839/odnu-vyborku-preobrazovat-v-druguu?mid=20164920#20164920
18 апр 17, 17:00    [20411678]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
Klick
Member

Откуда: Стерлитамак - Москва
Сообщений: 1023
Marin_1a
Klick,

А если нужно будет построить без него?
Совсем никак?


Ну вот тут коллеги вам ответили. Можете почитать по ссылкам решения. Но репортинг это делает одной левой. Кстати, вы все еще не перешли на хранимки?
19 апр 17, 10:35    [20413455]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
Marin_1a
Member

Откуда:
Сообщений: 125
Klick, сделала через Репортинг, он почему то собирает данные со всех SUBCATEGORY и выводит в AFFECTED_ITEM


SELECT
t.AFFECTED_ITEM,
t.SUBCATEGORY,
Table2,
Table3,
Table4

FROM (

SELECT DISTINCT AFFECTED_ITEM, SUBCATEGORY FROM [dbo].[INCIDENTSM1]
UNION
SELECT DISTINCT AFFECTED_ITEM, SUBCATEGORY FROM [dbo].[PROBSUMMARYM1]
UNION
SELECT DISTINCT AFFECTED_ITEM, SUBCATEGORY FROM [dbo].[REQUESTM1]
) t
LEFT JOIN (select DISTINCT AFFECTED_ITEM, SUBCATEGORY, count(*) as Table2 from [Group_New_DB].[dbo].[INCIDENTSM1] group by AFFECTED_ITEM, SUBCATEGORY) as t2 ON t.AFFECTED_ITEM = t2.AFFECTED_ITEM AND t.SUBCATEGORY = t2.SUBCATEGORY
LEFT JOIN (select DISTINCT AFFECTED_ITEM, SUBCATEGORY,count(*) as Table3 from [Group_New_DB].[dbo].[PROBSUMMARYM1] group by AFFECTED_ITEM, SUBCATEGORY) as t3 ON t.AFFECTED_ITEM = t3.AFFECTED_ITEM AND t.SUBCATEGORY = t3.SUBCATEGORY
LEFT JOIN (select DISTINCT AFFECTED_ITEM, SUBCATEGORY,count(*) as Table4 from [Group_New_DB].[dbo].[REQUESTM1] group by AFFECTED_ITEM, SUBCATEGORY) as t4 ON t.AFFECTED_ITEM = t4.AFFECTED_ITEM AND t.SUBCATEGORY = t4.SUBCATEGORY

WHERE t.AFFECTED_ITEM IS NOT NULL AND t.SUBCATEGORY IS NOT NULL
ORDER BY t.AFFECTED_ITEM, t.SUBCATEGORY

К сообщению приложен файл. Размер - 39Kb
19 апр 17, 12:15    [20413862]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
Marin_1a
Member

Откуда:
Сообщений: 125
Klick, что-то репортинг наоборот все объединил...

К сообщению приложен файл. Размер - 10Kb
19 апр 17, 14:14    [20414639]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к нескольким таблицам с одинаковым полем  [new]
Marin_1a
Member

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

сделала не через Matrix, а Table) Получилось,как хотела)
19 апр 17, 14:25    [20414711]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить