Как объединить подсчеты 3 разных таблиц и сгруппировать их по общему имени столбца во всех 3 таблицах

#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
  

Приветствия!