【问题标题】:Get Count values from 2 different table从 2 个不同的表中获取计数值
【发布时间】:2014-07-20 02:21:32
【问题描述】:

我正在使用 Sql Server 2008。有 3 个表 table1、table2、table3

表一,

Id  Name  group  
1   ddd   a       
2   aaa   b       
3   sss   a

table2 包含:

Id Name group
1  fff   c
2  gg    a
3  saa   b

表 3,

Id group
1  a
2  b
3  c

我想得到以下结果,

group     count(table1)   count(table2)
a           2               1
b           1               1
c           0               1

我可以写什么查询以获得适当的结果

【问题讨论】:

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


    【解决方案1】:

    你可以这样试试

    SELECT
       group,
       (SELECT COUNT(*) FROM table1 WHERE group=G.group)  AS table1count,
       (SELECT COUNT(*) FROM table2 WHERE group=G.group)  AS table2count
    FROM table3 G
    

    【讨论】:

    • 你不需要isnull()(甚至coalesce())。如果没有匹配,count(*) 将返回0
    • 是的。我没有注意到:) 纠正了我的答案。谢谢指正。
    【解决方案2】:

    试试这个:

    SELECT T3.[group],
           COUNT(T1.[group]) as Count1,
           COUNT(T2.[group]) as Count2
    FROM Table3 T3 LEFT JOIN
         Table1 T1 on T3.[group]=T1.[group] LEFT JOIN
         Table2 T2 on T3.[group]=T2.[group]
    GROUP BY T3.[group]
    

    结果:

    GROUP   COUNT1  COUNT2
    a       2       2
    b       1       1
    c       0       1
    

    SQL Fiddle 中查看结果。

    说明:

    COALESCE 将返回第一个不为空的参数。所以如果count为null,它会返回0。

    【讨论】:

    【解决方案3】:
    insert into @table1 
    values (1, 'aaa', 'a'),
    (1, 'bbb', 'b'),
    (1, 'ccc', 'c'),
    (1, 'ddd', 'd')
    
    
    insert into @table2 (id, name, groupcode) 
    values (1, 'aaa', 'a'),
    (1, 'bbb', 'b'),
    (1, 'ddd', 'd')
    
    insert into @table3 (id, name, groupcode) 
    values (1, 'aaa', 'a'),
    (1, 'bbb', 'b'),
    (1, 'ccc', 'c'),
    (1, 'ddd', 'd')
    
    SELECT tab1.groupcode,
           COUNT(tab1.groupcode) as Count1,
           COUNT(tab2.groupcode) as Count2,
           COUNT(tab3.groupcode) as Count3
    FROM @table1 tab1 
    INNER JOIN @Table2 tab2 on tab1.groupcode = tab2.groupcode 
    INNER JOIN @Table3 tab3 on tab1.groupcode = tab3.groupcode
    
    /*
        USE LEFT JOINS IF YOU WANT TO RETURN ALL 
        GROUPS EVEN IF THERE IS NOT A MATCH IN
        ONE OF THE TABLES
    */
    
    
    GROUP BY 
    tab1.groupcode
    

    【讨论】:

      【解决方案4】:

      尝试使用CROSS APPLY

      SELECT group, T1.T1Count, T2.T2Count
      FROM   Groups G
      CROSS APPLY
        (SELECT COUNT(*) AS T1Count FROM table1 AS IT1 WHERE G.group = IT1.group) T1
      CROSS APPLY
        (SELECT COUNT(*) AS T2Count FROM table2 AS IT2 WHERE G.group = IT2.group) T2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-14
        • 1970-01-01
        • 2017-07-28
        • 2017-07-05
        • 2021-10-27
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        相关资源
        最近更新 更多