1

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

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

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

任何建议将不胜感激!

卡尔

4

2 回答 2

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 列表将来可能会更改,那么您只需更新表而不是所有具有硬编码值列表的查询。

于 2010-03-15T07:25:28.143 回答
0

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

SELECT TypeID, Gender, [Count]=ISNULL(Count(*),0)  
  FROM <TABLE> 
GROUP BY TypeID, Gender
于 2010-03-15T07:21:00.347 回答