0

日付範囲のすべての値を含むテーブルを作成する以外に、データ範囲からデータソースとして選択する方法を教えてください。

私が達成しようとしているのは、別のテーブルから同じ週に作成されたすべてのアイテムの現在の合計を作成し、新しい週が 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

出力例:

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

2 に答える 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
于 2012-05-02T19:14:16.980 に答える
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)
        )
    )
于 2012-05-02T20:24:18.317 に答える