タイガーラック クリエイティブブログ
2024
September
13

PostgresSQLでカンマ区切りのデータを個別にカウントする方法

PostgreSQLでカンマ区切りのデータを個別にカウントしたい時があると思います。
そんな時にちょうどいい関数がありましたので紹介します。
※この記事はPostgreSQL 13.5 で動作確認してます。

その関数が
「regexp_split_to_table」

テーブル

id要件reg_date
1A,B,C2023/08/01 12:34:56
2C,E,F2023/08/02 09:00:00
3C,E2023/08/02 15:00:00
SELECT id,regexp_split_to_table(要件,',') AS 要件 FROM テーブル

この場合、要件のカラムの「,」で分割されて下記の様に出力されます。

id要件reg_date
1A2023/08/01 12:34:56
1B2023/08/01 12:34:56
1C2023/08/01 12:34:56
2C2023/08/02 09:00:00
2E2023/08/02 09:00:00
2F2023/08/02 09:00:00
3C2023/08/02 15:00:00
3E2023/08/02 15:00:00

このデータを集計すると下記の様になります。

SELECT 
   SUM(CASE 要件 WHEN 'A' THEN 1 ELSE 0 END) AS A
  ,SUM(CASE 要件 WHEN 'B' THEN 1 ELSE 0 END) AS B
  ,SUM(CASE 要件 WHEN 'C' THEN 1 ELSE 0 END) AS C
  ,SUM(CASE 要件 WHEN 'D' THEN 1 ELSE 0 END) AS D
  ,SUM(CASE 要件 WHEN 'E' THEN 1 ELSE 0 END) AS E
  ,SUM(CASE 要件 WHEN 'F' THEN 1 ELSE 0 END) AS F
FROM (
  SELECT id,regexp_split_to_table(要件,',') AS 要件
  FROM テーブル
) tbl

出力結果がこちら

ABCDEF
113021

行列変換がちょっと面倒ですが、これで集計ができました!


ついでに日付毎に集計を取る場合は下記のようにすると出力されます。

SELECT 
   date_trunc('day', reg_date)::date AS 日付,
  ,SUM(CASE 要件 WHEN 'A' THEN 1 ELSE 0 END) AS A
  ,SUM(CASE 要件 WHEN 'B' THEN 1 ELSE 0 END) AS B
  ,SUM(CASE 要件 WHEN 'C' THEN 1 ELSE 0 END) AS C
  ,SUM(CASE 要件 WHEN 'D' THEN 1 ELSE 0 END) AS D
  ,SUM(CASE 要件 WHEN 'E' THEN 1 ELSE 0 END) AS E
  ,SUM(CASE 要件 WHEN 'F' THEN 1 ELSE 0 END) AS F
FROM (
  SELECT id,regexp_split_to_table(要件,',') AS 要件
  FROM テーブル
) tbl
GROUP BY date_trunc('day', reg_date)::date
ORDER BY 日付 ASC;

出力結果がこちら

日付ABCDEF
2023/08/01111000
2023/08/02002021

このカテゴリの最新記事

関連記事

SHOP LIST

タイガーラック株式会社

〒577-0056
大阪府東大阪市長堂1-3-14 TOKUYASU Bld.