从具有空值的多个表中选择count(*)

时间:2016-12-28 14:33:43

标签: sql-server sql-server-2008-r2

      Table 1            Table 2 
        Class | VAL      Class | VAL
        ------|-----     ------|-----
          A   |  1         A   |  1     
          A   |  1         A   |  1
          A   |  1         A   |  1
          B   |  1         B   |  1
          A   |  1        
          B   |  1  
          C   |  1    
  
    

如果我有两个表,我需要结果如下表所示         需要的结果:

  
Class | T1  | T2
------|-----|-----
  A   |  4  |  3
  B   |  2  |  1
  C   |  1  |  0

我正在尝试此查询,但它无效。

SELECT [Class],COUNT(VAL) FROM dbo.T1 group by [Class]) 
UNION
SELECT [Class],COUNT(VAL) FROM dbo.T2 group by [Class]) 

4 个答案:

答案 0 :(得分:3)

SELECT COALESCE(a.Class, b.Class) AS [Class], COALESCE(a.T1,0) AS T1, COALESCE(b.T2,0) AS T2
FROM
(SELECT [Class],COUNT(VAL) AS T1 FROM dbo.T1 GROUP BY [Class]) a
FULL OUTER JOIN
(SELECT [Class],COUNT(VAL) AS T2 FROM dbo.T2 GROUP BY [Class]) b
ON a.Class = b.Class

另一种可能的解决方案

SELECT
    a.[Class]
    , COUNT(a.VAL1) AS T1
    , COUNT(a.VAL2) AS T2
FROM (
    SELECT [Class], VAL AS VAL1, NULL AS VAL2 FROM dbo.T1
    UNION ALL
    SELECT [Class], NULL AS VAL1, VAL AS VAL2 FROM dbo.T2
    ) a
GROUP BY
    a.Class;

答案 1 :(得分:1)

另一种方法

declare @table1 table (class varchar(1) null, val int)
declare @table2 table (class varchar(1) null, val int)

insert into @table1 values ('A', 1)
insert into @table1 values ('A', 1)
insert into @table1 values ('A', 1)
insert into @table1 values ('B', 1)
insert into @table1 values ('A', 1)
insert into @table1 values ('B', 1)
insert into @table1 values ('C', 1)

insert into @table2 values ('A', 1)
insert into @table2 values ('A', 1)
insert into @table2 values ('A', 1)
insert into @table2 values ('B', 1)

select t.Class, 
       (select count(val) from @table1 where class = t.class),
       (select count(val) from @table2 where class = t.class)
from  ( select class 
        from   @table1 t1
        union 
        select class
        from   @table2 t1
      ) t 

返回

Class   T1  T2  
A       4   3   
B       2   1   
C       1   0   

答案 2 :(得分:1)

Select Class, sum(T1) as T1, sum(T2) AS T2
From
(
 Select Class, VAL AS T1, 0 as T2
 From Table1
Union All
 Select Class, 0 as T1, VAL AS T2
 From Table2
 ) A
 group by A.Class

答案 3 :(得分:1)

   SELECT t1.class,
          COUNT(t1.class) AS T1,
          X.T2Count AS T2
    FROM @table1 t1
    OUTER APPLY(
          SELECT COUNT(val) AS T2Count
          FROM @table2 t2
          WHERE t2.class = t1.class
    )X
    GROUP BY t1.class,X.T2Count
    ORDER BY t1.class