Postgresql 9.6以上であれば、crosstab(text source_sql, text category_sql)を使えば表の形にできます。
CREATE TABLE example_table(date_at date, flag int);
INSERT INTO example_table values('2020/01/01', 0);
INSERT INTO example_table values('2020/01/02', 0);
INSERT INTO example_table values('2020/01/03', 0);
INSERT INTO example_table values('2020/02/01', 0);
INSERT INTO example_table values('2020/02/02', 0);
INSERT INTO example_table values('2020/03/01', 0);
INSERT INTO example_table values('2020/03/02', 0);
INSERT INTO example_table values('2020/03/03', 0);
INSERT INTO example_table values('2020/03/01', 1);
INSERT INTO example_table values('2020/03/02', 1);
-- 今後結果を得るために利便性の高いview(monthly_result)を作成しておきます。
CREATE VIEW monthly_result AS
select
to_char(date_at,'yyyy-mm') as month,
'flag' || flag::text as name,
COUNT(*) as num
from
example_table
group by
to_char(date_at,'yyyy-mm'), 'flag' || flag::text;
-- crosstabを有効にするのに必要です。各データベースで1度実行すればOKです。
CREATE EXTENSION tablefunc;
-- 次回以降は以下のクエリを発行すれば表が取得できます。
SELECT * FROM crosstab(
'SELECT month, name, num FROM monthly_result ORDER BY 1, 2')
AS (
"month" text, "flag0" bigint, "flag1" bigint
);
select
to_char(date_at,'yyyy-mm') as month,
COUNT(case when flag='0' then flag else NULL end) as flagA,
COUNT(case when flag='1' then flag else NULL end) as flagB
from
example_table
group by to_char(date_at,'yyyy-mm');
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。