Menu
Coddy logo textTech

CASE を使った SUM

CoddyのSQLジャーニー「応用」セクションの一部 — レッスン 13/27。

同じ考え方が SUM でも機能し、さらに柔軟です。CASE は一致する行に対して 1 を、それ以外に対して 0 を返すことができます。また、行を異なる重み付けにするために任意の数値を返すこともできます。

SELECT
    SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) AS active_count,
    SUM(CASE WHEN plan = 'pro' THEN amount ELSE 0 END) AS pro_revenue
FROM users

SUM(CASE … THEN 1 ELSE 0 END)COUNT(CASE … THEN 1 END) は、カウントにおいて同じ結果を返します。チームが好むスタイルを選択してください。

challenge icon

チャレンジ

簡単

利用可能なテーブルとカラム:

  • <strong>transactions</strong>: <strong>id</strong>, <strong>category</strong>, <strong>type</strong>, <strong>amount</strong>

type'sale' または 'refund' のいずれかです。各 category について、以下を返してください:

  • category
  • net_revenue: 売上額の合計から返金額の合計を差し引いたもの

返金を負の数として扱う単一の SUM(CASE …) 式で net_revenue を計算してください。net_revenue の降順で並べ替えてください。

チートシート

SUMCASEと組み合わせて使用することで、条件付きで値を集計できます。カウントする場合は1/0を返し、加重合計の場合は実際の値を返します:

SELECT
    SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) AS active_count,
    SUM(CASE WHEN plan = 'pro' THEN amount ELSE 0 END) AS pro_revenue
FROM users

SUM(CASE … THEN 1 ELSE 0 END)COUNT(CASE … THEN 1 END)は、同じカウント結果を生成します。

自分で試してみよう

SELECT category,
       -- 返金を負の値としてカウントする1つの SUM(CASE ...)
FROM transactions
GROUP BY category
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

応用のすべてのレッスン