▽1
●
y-kawaz ●100ポイント ベストアンサー |
その出力を必要とするシーンにツッコミたくなりますがそこはスルーしてSQLクイズのつもりで答えます。また、カラムの型とかも不明なので日付関連はdate型として話を進めます。
とりあえずテストデータを作って…
create TABLE t ("年月日" date,"売上" int,"税込" int); INSERT INTO t VALUES('2012-01-01',100,105); INSERT INTO t VALUES('2012-01-15',200,210); INSERT INTO t VALUES('2012-03-05',300,315); INSERT INTO t VALUES('2012-06-03',200,210); INSERT INTO t VALUES('2012-08-01',50,52); INSERT INTO t VALUES('2012-12-01',100,105); INSERT INTO t VALUES('2013-01-01',100,105);
SQLと出力はこんな感じでどうでしょう。
SELECT s.ym "年月", COALESCE(sum("売上"), 0) "売上の集計", '売上' "売上or税込" FROM (SELECT ('2012-' || s.m || '-01')::date ym FROM generate_series(1,12) as s(m)) s LEFT OUTER JOIN (SELECT date_trunc('month', "年月日") ym, "売上" FROM t) t2 ON s.ym=t2.ym GROUP BY s.ym UNION SELECT s.ym "年月", COALESCE(sum("税込"), 0) "売上の集計", '税込' "売上or税込" FROM (SELECT ('2012-' || s.m || '-01')::date ym FROM generate_series(1,12) as s(m)) s LEFT OUTER JOIN (SELECT date_trunc('month', "年月日") ym, "税込" FROM t) t2 ON s.ym=t2.ym GROUP BY s.ym ORDER BY "年月", "売上or税込";
出力
年月 | 売上の集計 | 売上or税込 ------------+------------+------------ 2012-01-01 | 300 | 売上 2012-01-01 | 315 | 税込 2012-02-01 | 0 | 売上 2012-02-01 | 0 | 税込 2012-03-01 | 300 | 売上 2012-03-01 | 315 | 税込 2012-04-01 | 0 | 売上 2012-04-01 | 0 | 税込 2012-05-01 | 0 | 売上 2012-05-01 | 0 | 税込 2012-06-01 | 200 | 売上 2012-06-01 | 210 | 税込 2012-07-01 | 0 | 売上 2012-07-01 | 0 | 税込 2012-08-01 | 50 | 売上 2012-08-01 | 52 | 税込 2012-09-01 | 0 | 売上 2012-09-01 | 0 | 税込 2012-10-01 | 0 | 売上 2012-10-01 | 0 | 税込 2012-11-01 | 0 | 売上 2012-11-01 | 0 | 税込 2012-12-01 | 100 | 売上 2012-12-01 | 105 | 税込
もう一つの質問見ると年月日はテキスト型のようなので、文字列バージョンも回答しておきます。
まずテストデータを作ります。
CREATE TABLE t ("年月日" text, "売上" int, "税込" int); INSERT INTO t VALUES('20120101',100,105); INSERT INTO t VALUES('20120115',200,210); INSERT INTO t VALUES('20120305',300,315); INSERT INTO t VALUES('20120603',200,210); INSERT INTO t VALUES('20120801',50,52); INSERT INTO t VALUES('20121201',100,105); INSERT INTO t VALUES('20130101',100,105);
SQLです。
SELECT s.ym "年月", COALESCE(sum("売上"), 0) "売上の集計", '売上' "売上or税込" FROM (SELECT ym::text FROM generate_series(201201,201212) as s(ym)) s LEFT OUTER JOIN (SELECT substr("年月日",1,6) ym, "売上" FROM t) t2 ON s.ym=t2.ym GROUP BY s.ym UNION SELECT s.ym "年月", COALESCE(sum("税込"), 0) "売上の集計", '税込' "売上or税込" FROM (SELECT ym::text FROM generate_series(201201,201212) as s(ym)) s LEFT OUTER JOIN (SELECT substr("年月日",1,6) ym, "税込" FROM t) t2 ON s.ym=t2.ym GROUP BY s.ym ORDER BY "年月", "売上or税込";
出力です。
年月 | 売上の集計 | 売上or税込 --------+------------+------------ 201201 | 300 | 売上 201201 | 315 | 税込 201202 | 0 | 売上 201202 | 0 | 税込 201203 | 300 | 売上 201203 | 315 | 税込 201204 | 0 | 売上 201204 | 0 | 税込 201205 | 0 | 売上 201205 | 0 | 税込 201206 | 200 | 売上 201206 | 210 | 税込 201207 | 0 | 売上 201207 | 0 | 税込 201208 | 50 | 売上 201208 | 52 | 税込 201209 | 0 | 売上 201209 | 0 | 税込 201210 | 0 | 売上 201210 | 0 | 税込 201211 | 0 | 売上 201211 | 0 | 税込 201212 | 100 | 売上 201212 | 105 | 税込 (24 行)