2017-01-20 16 views
-2

私はSQLサーバーを使用していますが、これに関連するとは思わないです。 私のクエリは、はるかに複雑であるが、私は、次の挑戦直面している:私は雇用の週でグループ化された図書の雇用なので、テーブル(クリーンアップ)をカウントする が好きです:SQL Group By Count All Groups

Name  Week 
Book1  1 
Book1  1 
Book1  2 
Book2  2 
Book3  1 
Book3  1 
Book3  2 

そしてIこの出力が必要です:

Name   Week  Count 
Book1   1   2 
Book1   2   1 
Book2   1   0 <- Not showing 
Book2   2   1 
Book3   1   2 
Book3   2   1 

しかし、イベントがないため、私の質問には本2週目のカウントが表示されません。

どうすればいいですか?

+0

「クリーンな」XDという言葉に非常に邪魔されているようです。あなたが落として慎重に読まなかったのはそうかもしれません。 週13はありません。別の週のサブクエリですべての週を見つけることができます。 –

答えて

1

count()に貢献するデータがないノードがある場合は、事前にそれらの内容を特定する必要があります(サンプルケースでは、書籍と週の組み合わせがあるようです)。 cross joinを一緒にする必要があります。これは、データがあるかどうかにかかわらず、見たいすべてのグループとしてクエリのスケルトンフレームワークを形成します。その製造されたcte/subqueryから、あなたは実際のデータに参加することができます。そして、それらの行に対して0のカウントが得られます。

ので

;with books (book) as 
(
    select 'book1' union all 
    select 'book2' union all 
    select 'book3' 
), weeks (week) as 
(
    select 1 union all 
    select 2 union all 
    select 3 
), skelly as 
(
    select Book, Week 
    from books 
    cross join weeks 
) 
select book, week, count(1) 
from skelly 
left outer join <sometable> 
    on <some join condition> 

のようなものは今、明らかに私はちょうどそのデータアップを行いました。たぶんあなたはそれを動的に生成するのに使うことができるソースを持っているかもしれませんが、それはあなたを始めさせるはずです。

+1

これは私が見た最善のアプローチです。ありがとう! –