2011-08-04 4 views
4

私のテーブルにGROUP BYを使用して、週ごとにエントリをグループ化しようとしています。ただし、特定の週にエントリがない場合、欠落しているエントリに対して、どのように0を挿入できますか?GROUP BYを実行中に不足しているエントリを挿入しますか?

CREATE TABLE #TEMP (startdate datetime) 

INSERT INTO #TEMP VALUES('2011-02-01') 
INSERT INTO #TEMP VALUES('2011-02-02') 
INSERT INTO #TEMP VALUES('2011-02-03') 
INSERT INTO #TEMP VALUES('2011-02-04') 
INSERT INTO #TEMP VALUES('2011-02-05') 
INSERT INTO #TEMP VALUES('2011-02-18') 
INSERT INTO #TEMP VALUES('2011-02-19') 
INSERT INTO #TEMP VALUES('2011-02-20') 
INSERT INTO #TEMP VALUES('2011-02-21') 

SELECT DATEPART(YEAR,startdate) AS 'AYear', 
     DATEPART(wk,startdate) AS 'AWeek', 
     COUNT(*) 
FROM #TEMP 
GROUP BY DATEPART(YEAR,startdate),DATEPART(wk,startdate) 
ORDER BY 1,2 

DROP TABLE #TEMP 

私が取得しています:

AYear AWeek (No column name) 
2011  6  5 
2011  8  2 
2011  9  2 

が、私はこれ欲しい:これを行う方法について

AYear AWeek (No column name) 
2011  6  5 
2011  7  0 
2011  8  2 
2011  9  2 

任意の提案を?

答えて

4

あなたはすべての可能な週/年でテーブルを生成し、これを行うことができます。

SELECT fw.Year AS 'AYear', 
     fk.Week AS 'AWeek', 
     SUM(CASE WHEN t.startdate is not null then 1 ELSE 0 END) 
FROM FakeWeeks fw 
LEFT OUTER JOIN #TEMP t ON DATEPART(YEAR,startdate) = fw.year AND DATEPART(wk,startdate) = fw.week 
GROUP BY DATEPART(YEAR,startdate),DATEPART(wk,startdate) 
ORDER BY 1,2 

それとも、あなたは経済的な感じている場合には、二つのテーブル、年間で1 1-と1を生成します52と両方に参加する。

+0

+1です。 0カウントを表示するには、おそらくCOUNT(*)をCOUNT(startdate)に変更する必要があります。 – bobs

+0

パーフェクト!ありがとう!私は受け入れタイムアウトの後にこれを受け入れます。 – Legend

関連する問題