我想问的问题最好通过一个例子来说明,所以请耐心等待。假设我有下表:
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
我可以想到一些可能做到这一点的方法,但对我来说,它们似乎都不是特别优雅。
任何建议都将不胜感激!
卡尔
答案 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