【问题标题】:SQL Select Count with join on other table does not include the 0 countSQL Select Count with join on other table 不包括 0 计数
【发布时间】:2013-12-28 09:52:55
【问题描述】:

我在 SQL Server 2008 上有以下数据库:

用户表:

    id           Name            Country      BloodTypeId   
---------+---------------+------------+-----------------+
1            John            US            1            
2            Kate            China         1
3            Sam             US            2
4            Tom             Canada        1
5            Mike            US            1            
6            Carol           China         3
7            Daniel          US            2
8            Joseph          US            1
9            Mary            US            3            
10           Peter           China         1

血型表

    BloodTypeId      BloodTypename    
------------+------------------+
1                 A
2                 B
3                 O
4                 AB

我需要一个 sql 脚本来返回每个国家的血型数量: 所以对于上面的数据库,我需要它返回:

    Country      BloodType     Count
---------+---------------+------------+
US               A          3
US               B          2
US               O          1
US               AB         0
China            A          2  
China            B          0
China            O          1
China            AB         0
Canada           A          1
Canada           B          0
Canada           O          0
Canada           AB         0

请注意,当某个国家/地区没有特定血型的用户时,我需要它以 0 计数显示。

我尝试了什么: 我尝试了以下脚本:

SELECT Country, BloodTypename as BloodType, COUNT(1) as Count 
FROM Users
JOIN Bloodtypes
ON Users.BloodtypeId = Bloodtypes.BloodtypeId 
GROUP BY  Country, BloodTypename
ORDER BY Country

这个查询给了我这个结果:

     Country      BloodType     Count
---------+---------------+------------+
US               A          3
US               B          2
US               O          1
China            A          2  
China            O          1
Canada           A          1

没有出现计数为0的血型

我尝试改用RIGHT JOIN

SELECT Country, BloodTypename as BloodType, COUNT(1) as Count 
FROM Users
RIGHT JOIN Bloodtypes
ON Users.BloodtypeId = Bloodtypes.BloodtypeId 
GROUP BY  Country, BloodTypename
ORDER BY Country

但仍然得到相同的结果

我如何选择我需要的并包括所有血型,甚至是计数为 0 的血型?

非常感谢

【问题讨论】:

    标签: sql sql-server-2008 count


    【解决方案1】:

    你必须得到country和血型的所有组合,通过使用CROSS JOIN然后LEFT JOIN得到它们的笛卡尔积。像这样的:

    SELECT 
      t.country,
      t.BloodTypename,
      COUNT(DISTINCT u.id) as Count 
    FROM
    (
      SELECT u.country, b.BloodTypeId, b.BloodTypename
      FROM Users u 
      CROSS JOIN Bloodtypes b
    )AS t
    LEFT JOIN Users AS u ON u.BloodtypeId = t.BloodtypeId  AND t.country = u.country
    GROUP BY t.country,  t.BloodTypename
    ORDER BY Country DESC;
    

    这会给你:

    | COUNTRY | BLOODTYPENAME | COUNT |
    |---------|---------------|-------|
    |      US |             A |     3 |
    |      US |            AB |     0 |
    |      US |             B |     2 |
    |      US |             O |     1 |
    |   China |             A |     2 |
    |   China |            AB |     0 |
    |   China |             B |     0 |
    |   China |             O |     1 |
    |  Canada |             A |     1 |
    |  Canada |            AB |     0 |
    |  Canada |             B |     0 |
    |  Canada |             O |     0 |
    

    【讨论】:

      【解决方案2】:

      尝试使用left outer join 它返回左表(用户)中的所有行,以及右表(血型)中的匹配行。没有匹配时,右边的结果为NULL,所以NULL的计数为0

      SELECT Country, BloodTypename as BloodType, COUNT(1) as Count 
      FROM Users LEFT OUTER
      JOIN Bloodtypes
      ON Users.BloodtypeId = Bloodtypes.BloodtypeId 
      GROUP BY  Country, BloodTypename
      ORDER BY Country
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-30
        • 1970-01-01
        • 1970-01-01
        • 2021-06-14
        • 2022-10-06
        • 2018-05-13
        • 2011-10-16
        相关资源
        最近更新 更多