2010-03-15 43 views
1

我想問的是最好的例子,請耐心等待。假設我有下面的表格:SQL:如何在沒有任何東西需要聚合的情況下返回零值?

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

我想聚合TypeID和Gender的每種可能的組合。凡TYPEID可以是1,2或3,性別可以是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

哪個數據庫? – 2010-03-15 07:29:09

回答

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表,這樣就可以和他們在一起。如果將來可能更改允許的類型標識列表,那麼您只需更新表格而不是具有硬編碼值列表的所有查詢。

+0

很好的答案,謝謝。我認爲「SELECT T1.TypeID,T1.Gender ...」只需要替換爲「SELECT TypeIDs.TypeID,Genders.Gender ...」 – Karl 2010-03-15 07:44:40

+0

@Karl:你是對的,否則你會在那裏得到NULL。 – 2010-03-15 07:47:47

0

如何創建一個臨時表將包含不包含你的桌子上然後執行該腳本記錄?

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