SQL

SQLでグループごとに条件を指定してカウントする方法

やりたいことは以下のとおりです。ジョブのログを管理するテーブルから、ジョブ名ごとに各ログレベル(CRITICAL, ERROR, WARN)のカウントを集計する方法をメモしておきます。

+------+----------+------------+ +------+----------+-------+------+
| name | level | date | | name | CRITICAL | ERROR | WARN |
+------+----------+------------+ +------+----------+-------+------+
| job1 | ERROR | 2019-04-01 | -> | job1 | 0 | 1 | 2 |
| job1 | WARN | 2019-04-02 | | job2 | 1 | 0 | 2 |
| job1 | WARN | 2019-04-03 | | job3 | 0 | 0 | 3 |
| job2 | CRITICAL | 2019-04-01 | +------+----------+-------+------+
| job2 | WARN | 2019-04-02 |
| job2 | WARN | 2019-04-03 |
| job3 | WARN | 2019-04-01 |
| job3 | WARN | 2019-04-02 |
| job3 | WARN | 2019-04-03 |
+------+----------+------------+
view raw hoge.txt hosted with ❤ by GitHub

GROUP BYCASESUMを使う

先にSQLを載せておきます。

SELECT
name,
SUM(CASE WHEN level = 'CRITICAL' THEN 1 ELSE 0 END) AS CRITICAL,
SUM(CASE WHEN level = 'ERROR' THEN 1 ELSE 0 END) AS ERROR,
SUM(CASE WHEN level = 'WARN' THEN 1 ELSE 0 END) AS WARN
FROM
log
GROUP BY
name
view raw hoge.sql hosted with ❤ by GitHub

まずは、GROUP BYでジョブ名ごとにグルーピングします。続いて、CASE式を使って各ログレベルが存在するかどうかの条件を設定し、SUMで各ログレベルの数をカウントしています。

まとめ

SQLでグループごとに条件を指定してカウントする方法でした。GROUP BYCASESUMを使えばOKです。

-SQL

S