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

时间:2010-03-15 07:17:37

标签: sql aggregate zero

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

TypeID  Gender      Count
1       M           10
1       F           3
1       F           6  
3       M           11
3       M           8

我想为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

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

任何建议都将不胜感激!

卡尔

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

如何创建一个包含未包含在表中的记录的临时表,然后执行此脚本?

SELECT TypeID, Gender, [Count]=ISNULL(Count(*),0)  
  FROM <TABLE> 
GROUP BY TypeID, Gender