2009-10-19 34 views
1

我有三個表(SQL Server)的如何返回零使用COUNT()與多個表

月 - month_id,月份名稱,....

獎 - award_id,獎勵名稱,.. ..

提名 - fk_award_idfk_month_id,姓名,地址,...

我需要統計不同類型的每月頒發獎項的數量,而在病例返回0,其中沒有人授予

for ex。
結果應該看起來像

April-09  Gold   10 
April-09  Silver  2 
April-09  Bronze  0  
May-09  Gold   2 
May-09  Silver  1 
May-09  Bronze  0 

這可能嗎?

回答

2

一些數據來測試:

DECLARE @months TABLE 
(month_id INT IDENTITY, 
month_name VARCHAR(50) 
) 

INSERT INTO @months(month_name) VALUES ('April-09') 
INSERT INTO @months(month_name) VALUES ('May-09') 

DECLARE @awards TABLE 
(award_id INT IDENTITY, 
award_name VARCHAR(50) 
) 

INSERT INTO @awards(award_name) VALUES ('Bronze') 
INSERT INTO @awards(award_name) VALUES ('Silver') 
INSERT INTO @awards(award_name) VALUES ('Gold') 

DECLARE @nominations TABLE 
(fk_month_id INT, 
fk_award_id INT, 
other_field VARCHAR(10) 
) 

INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (1,1,'1') 
INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (1,1,'2') 
INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (2,2,'3') 
INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (2,1,'4') 
INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (3,1,'5') 
INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (3,2,'6') 
INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (3,2,'7') 

和查詢

SELECT month_name, award_name, ISNULL(cnt,0) 
FROM @months 
CROSS JOIN @awards 
LEFT JOIN ( 
    SELECT fk_month_id,fk_award_id, COUNT(*) AS cnt 
    FROM @nominations 
    GROUP BY fk_month_id,fk_award_id 
) fk ON fk_month_id = month_id AND fk_award_id = award_id 

結果是:

April-09 Bronze 2 
April-09 Silver 0 
April-09 Gold 0 
May-09 Bronze 1 
May-09 Silver 1 
May-09 Gold 0 
0

group by month_id, award_id plus out join會做的伎倆

0

像這樣的東西是你所需要的。未經測試,但原則是:

SELECT m.Monthname, a.Awardname, COUNT(*) 
    FROM Month m 
     LEFT JOIN Nomination n ON n.fK_Month_ID = m.MonthID 
     LEFT JOIN Award a ON n.FK_Award_ID = a.AwardID 
    GROUP BY m.Monthname, a.Awardname 

關鍵是GROUP BY條款。