2012-05-02 22 views
0

日付範囲のすべての値を持つテーブルを作成するのではなく、データソースとしてデータソースからどのように選択しますか。データソースとして日付範囲から選択する方法

items 
----------------------------- 
created_on | name  | type 
----------------------------- 
2012-01-01 | Cards | 1 
2012-01-09 | Red Pen | 2 
2012-01-31 | Pencil | 2 
2012-02-01 | Blue Pen | 2 

types 
-------------- 
name  | id 
-------------- 
Fun  | 1 
Writing | 2 

サンプル:

私は何を達成しようとしていることは0新しい

例のテーブルで数週間を示す一方で、別のテーブルから同じ週以内に作成されたすべての項目の累計を作成することです出力:

---------------------------- 
year | week | fun | writing 
---------------------------- 
2012 | 1 | 1 | 0 
2012 | 2 | 0 | 1 
2012 | 3 | 0 | 0 
2012 | 4 | 0 | 0 
2012 | 5 | 0 | 2 

答えて

2

あなたは週番号の番号列を生成することができ

SELECT 
    w.week 
FROM 
    (SELECT generate_series(1,52) as week) as w 

SELECT 
    w.year, 
    w.week, 
    COUNT(i1) as fun, 
    COUNT(i2) as writing 
FROM (SELECT 2012 as year, generate_series(1,6) as week) as w 
LEFT JOIN items i1 ON i1.type = 1 AND w.week = EXTRACT(WEEK FROM i1.created_on) 
LEFT JOIN items i2 ON i2.type = 2 AND w.week = EXTRACT(WEEK FROM i2.created_on) 
GROUP BY 
    w.year, 
    w.week 
ORDER BY 
    w.year, 
    w.week 
+1

[sqlfiddle.com](http://sqlfiddle.com)を参照すると、複数のタイプのRDBMSに対するクエリをテストするのに便利です。 – Chad

+0

いいえ - あなたのJOINはあまりにも制限的です。今あなたが持っているものは、 'generate_series()'を無効にします。 (それほど重要ではないが、 'i.EXTRACT'は文法エラーを表示し、COUNT(*ブーリアン式*)はあなたが望むことをしません。) – pilcrow

+0

sqlfiddleのおかげで、クエリにいくつかのエラーがありました。 PostgreSQLでは2012-01-01が第1週の一部であるとは考えていませんが、現在はうまくいくはずです。 – erikxiv

0

非常に近いerikxivが、あなたは正しい方向に私を得ました。私は情報を取得するために必要な複数のテーブルを持っています。これは選択フィールドの追加選択です。

select 
    date_year.num, 
    date_week.num, 
    ( select count(*) from items x 
     and EXTRACT(YEAR FROM x.created_on) = date_year.num 
     and EXTRACT(WEEK FROM x.created_on) = date_week.num 
    ) as item_count 
from 
    (SELECT generate_series(2011, date_part('year', CURRENT_DATE)::INTEGER) as num) as date_year, 
    (SELECT generate_series(1,52) as num) as date_week 
where 
    (
     date_year.num < EXTRACT (YEAR FROM CURRENT_DATE) 
     OR 
     (
      date_year.num = EXTRACT (YEAR FROM CURRENT_DATE) AND 
      date_week.num <= EXTRACT (WEEK FROM CURRENT_DATE) 
     ) 
    ) 
関連する問題