#sql-server
#sql-server
Вопрос:
У меня есть 3 таблицы с одинаковыми столбцами, мне нужно получить количество строк относительно столбца packname для всех 3 таблиц.
Ниже приведены данные таблицы ввода и вывода.
TABLE 1
CALLERID PACKANME
9882000342 DOC
9882000560 DOC
9882000945 RAJ
9882002655 CAR
9882003225 CAR
TABLE 2
CALLERID PACKANME
9882000342 DOC
9882000560 DOC
9882000945 RAJ
9882002655 CAR
TABLE 3
CALLERID PACKANME
9882000342 DOC
9882000560 DOC
9882000945 RAJ
OUTPUT
PACKNAME COUNT TAB2 COUNT TAB3
DOC 2 2
RAJ 1 1
CAR 1 0
Я попробовал приведенный ниже запрос и остановился здесь, я полагаю, что мы используем pivot для получения желаемого результата, но не можем этого сделать.Пожалуйста, помогите мне.
Select 'TableA' as 'TableName',tbla.packname as Ptype,Count(tbla.num) as MobCnt from tbla
Group By tbla.packname
Union all
Select 'TableB' as 'TableName',tblb.packname as Ptype,Count(tblb.num)as MobCnt from tblb
Group By tblb.packname
Union all
Select 'TableC' as 'TableName',tblc.packname as Ptype,Count(tblc.num)as MobCnt from tblc
Group By tblc.packname
Ответ №1:
Прежде всего, сгенерируйте список различных имен пакетов во всех таблицах. Затем внешнее объединение подсчета каждой таблицы с этим. Таким образом, вы можете правильно прочитать нулевые значения.
SELECT
list.packname,
ISNULL(A.ACnt, 0) AS Tblacount,
ISNULL(B.BCnt, 0) AS Tblbcount,
ISNULL(C.CCnt, 0) AS Tblccount
FROM
(
SELECT packname FROM tbla
UNION
SELECT packname FROM tblb
UNION
SELECT packname FROM tblc
) list
LEFT JOIN
(
Select tbla.packname as Ptype, Count(*) as ACnt from tbla
Group By tbla.packname
) A ON list.packname = A.Ptype
LEFT JOIN
(
Select tblb.packname as Ptype, Count(*) as BCnt from tblb
Group By tblb.packname
) B ON list.packname = B.Ptype
LEFT JOIN
(
Select tblc.packname as Ptype, Count(*) as CCnt from tblc
Group By tblc.packname
) C ON list.packname = C.Ptype
Ответ №2:
Предполагая, что у вас нет канонического источника для всех возможных packname
значений:
select packname ,
count( distinct t1.callerid ) ,
count( distinct t2.callerid ) ,
count( distinct t3.callerid )
from ( select packname from table1
union select packname from table2
union select packname from table3
) t
left join table1 t1 on t1.packname = t.packname
left join table2 t2 on t2.packname = t.packname
left join table3 t3 on t3.packname = t.packname
group by packname
order by packname
Агрегирующие функции, за исключением count(*)
, исключают нулевые значения из рассмотрения.
Если у вас есть канонический источник для домена packname
:
select packname ,
count( distinct t1.callerid ) ,
count( distinct t2.callerid ) ,
count( distinct t3.callerid )
from packname_source t
left join table1 t1 on t1.packname = t.packname
left join table2 t2 on t2.packname = t.packname
left join table3 t3 on t3.packname = t.packname
group by packname
order by packname
Приветствия!