SQL:如何在没有任何内容聚合的地方返回零?

Kar*_*arl 1 sql aggregate zero

我想问的问题最好通过一个例子说明,所以请耐心等待.假设我有下表:

TypeID  Gender      Count
1       M           10
1       F           3
1       F           6  
3       M           11
3       M           8
Run Code Online (Sandbox Code Playgroud)

我想为TypeID和Gender的每种可能组合聚合这个.其中TypeID可以是1,2或3,而Gender可以是M或F.所以我想要的是以下内容:

TypeID  Gender      SUM(Count)
1       M           10
1       F           9
2       M           0  
2       F           0
3       M           19
3       F           0
Run Code Online (Sandbox Code Playgroud)

我可以想到一些可能做到这一点的方法,但对我来说,它们似乎都不是特别优雅.

任何建议将不胜感激!

卡尔

Mar*_*ers 6

使用派生表创建要返回的行,并使用左连接来获取计数.使用COALESCE将任何NULL计数转换为零.

SELECT TypeIds.TypeId, Genders.Gender, COALESCE(SUM(T1.Count), 0)
FROM (
    SELECT 1 AS TypeId
    UNION ALL
    SELECT 2
    UNION ALL
    SELECT 3
) AS TypeIds
CROSS JOIN (
    SELECT 'M' AS Gender
    UNION ALL
    SELECT 'F'
) AS Genders
LEFT JOIN Table1 AS T1
ON TypeIds.TypeId = T1.TypeId AND Genders.Gender = T1.Gender
GROUP BY TypeIds.TypeId, Genders.Gender
Run Code Online (Sandbox Code Playgroud)

可能值得考虑在数据库中创建这些性别和类型ID表,以便您可以加入它们.如果允许的类型ID列表将来可能会更改,那么您只需更新表而不是所有具有硬编码值列表的查询.