SQL - объединение нескольких таблиц - PullRequest
1 голос
/ 12 июля 2011

Привет, может быть, кто-то может помочь мне здесь ... У меня небольшая проблема с оператором SQL.(На MS - SQL Server 2008) Итак, у меня есть 6 таблиц, выглядящих так:

ID / Компания / Месяц / ClosedTimeStamp / Различная информация

Теперь мне нужно (предпочтительно в одном операторе: P)количество наборов данных из каждой таблицы, сгруппированной по компании и месяцу, в то время, когда она выглядит примерно так.И еще одна вещь: не во всех таблицах должны быть данные для этой компании и этого месяца, поэтому в качестве результата для счета может быть 0 (*)

SELECT COUNT(*) as c, Month, Company 
FROM Table1  WHERE ClosedTimeStamp IS NULL
GROUP BY Company, Month 
ORDER BY Company

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

Извините, что-то забыл ... результат должен выглядеть следующим образом:

Компания / месяц/ CountTable1 / CountTable2 / CountTable3 / ..... Test 02 1 0 50

Если это невозможно в одном утверждении, тогда я должен заставить его работать по-другому.:)

Спасибо

Lim

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

СОЮЗИТЕ ВСЕ строки таблицы, а затем выполните подсчет

SELECT COUNT(*) as c, Month, Company 
FROM 
(
SELECT Month,Company FROM Table1  WHERE ClosedTimeStamp IS NULL
UNION ALL
SELECT Month,Company FROM Table2  WHERE ClosedTimeStamp IS NULL
UNION ALL
SELECT Month,Company FROM Table3  WHERE ClosedTimeStamp IS NULL
UNION ALL
SELECT Month,Company FROM Table4  WHERE ClosedTimeStamp IS NULL
UNION ALL
SELECT Month,Company FROM Table5  WHERE ClosedTimeStamp IS NULL
UNION ALL
SELECT Month,Company FROM Table6  WHERE ClosedTimeStamp IS NULL
) AS t
GROUP BY Company, Month 
ORDER BY Company

Если вы хотите получить сумму для каждой таблицы, укажите компанию в одной строке

SELECT SUM(t1) t1,SUM(t2) t2,SUM(t3) t3,SUM(t4) t4,SUM(t5) t5,SUM(t6) t6, Month, Company 
FROM 
(
SELECT Month,Company, 1 t1,0 t2, 0 t3, 0 t4, 0 t5, 0 t6 FROM Table1  WHERE ClosedTimeStamp IS NULL
UNION ALL
SELECT Month,Company, 0 t1,1 t2, 0 t3, 0 t4, 0 t5, 0 t6 FROM Table2  WHERE ClosedTimeStamp IS NULL
UNION ALL
SELECT Month,Company, 0 t1,0 t2, 1 t3, 0 t4, 0 t5, 0 t6 FROM Table3  WHERE ClosedTimeStamp IS NULL
UNION ALL
SELECT Month,Company, 0 t1,0 t2, 0 t3, 1 t4, 0 t5, 0 t6 FROM Table4  WHERE ClosedTimeStamp IS NULL
UNION ALL
SELECT Month,Company, 0 t1,0 t2, 0 t3, 0 t4, 1 t5, 0 t6 FROM Table5 WHERE ClosedTimeStamp IS NULL
UNION ALL
SELECT Month,Company, 0 t1,0 t2, 0 t3, 0 t4, 0 t5, 1 t6 FROM Table6  WHERE ClosedTimeStamp IS NULL
) AS t
GROUP BY Company, Month 
ORDER BY Company
1 голос
/ 12 июля 2011

Если бы ваша БД была нормализована, запрос был бы намного проще.

Поскольку ваши company и Month распределены по 6 таблицам, нам нужно сделать union из этих таблиц, чтобы получить отдельный набор данных для всех company + month, как таковой:

select company, month from table1
 union
select company, month from table2
 union
select company, month from table3
 union
select company, month from table4
 union
select company, month from table5
 union
select company, month from table6

Обратите внимание, что нам нужен union, а не union all, потому что мы не хотим повторения одной и той же пары компания + месяц.

Затем просто используйте этот набор данных для запроса количеств для каждой таблицы:

select t.company, t.month,
    (select count(*) from table1
      where company = t.company
        and month = t.month
        and ClosedTimeStamp is null) as qt1,
    (select count(*) from table2 
      where company = t.company
        and month = t.month
        and ClosedTimeStamp is null) as qt2,
    (select count(*) from table3
      where company = t.company 
        and month = t.month
        and ClosedTimeStamp is null) as qt3,
    (select count(*) from table4
      where company = t.company
        and month = t.month
        and ClosedTimeStamp is null) as qt4,
    (select count(*) from table5
      where company = t.company
        and month = t.month
        and ClosedTimeStamp is null) as qt5,
    (select count(*) from table6
      where company = t.company
        and month = t.month
        and ClosedTimeStamp is null) as qt6
from (
  select company, month from table1
   union
  select company, month from table2
   union
  select company, month from table3
   union
  select company, month from table4
   union
  select company, month from table5
   union
  select company, month from table6
) t
order by t.company
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...