フィルタ付き集計の計算
特定のフィルタ条件に合致するイベントの発生回数を数えたい場合、SUM()、MIN()、MAX() といった集計関数や CASE 式を活用できます。たとえば、SUM(CASE WHEN ir.IncidentTypeID = 1 THEN 1 ELSE 0 END) は、インシデント種別 1 に該当するインシデントの件数を返します。各インシデント種別ごとに 1 つずつ SUM() を用意すれば、インシデント種別 ID を軸にデータをピボットしたことになります。
このシナリオでは、管理側から、インシデント種別ごとに「大きなインシデント」の日と「小さなインシデント」の日が何日あったかを報告するよう依頼されています。管理側の定義では、同一日に同一インシデント種別が 5 回を超えて発生した日は「大きなインシデント」の日、1~5 回であれば「小さなインシデント」の日とします。
この演習はコースの一部です
SQL Serverで学ぶ時系列分析
演習の手順
SUM()で大きなインシデント日と小さなインシデント日の日数を計算できるよう、CASE式を完成させてください。CASE式では、条件を満たす場合は 1、満たさない場合は 0 を返してください。- 列を参照する際は、
ir.IncidentDateやit.IncidentTypeのように必ずエイリアスを付けて指定してください!
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
SELECT
it.IncidentType,
-- Fill in the appropriate expression
SUM(___ WHEN ir.NumberOfIncidents > 5 THEN ___ ELSE ___ ___) AS NumberOfBigIncidentDays,
-- Number of incidents will always be at least 1, so
-- no need to check the minimum value, just that it's
-- less than or equal to 5
SUM(___ WHEN ir.NumberOfIncidents <= 5 THEN ___ ELSE ___ ___) AS NumberOfSmallIncidentDays
FROM dbo.IncidentRollup ir
INNER JOIN dbo.IncidentType it
ON ir.IncidentTypeID = it.IncidentTypeID
WHERE
ir.IncidentDate BETWEEN '2019-08-01' AND '2019-10-31'
GROUP BY
it.IncidentType;