CASE WHEN と SUM() を使用して SQL で列をピボットする
データ変換では、多くの場合、テーブルの再形成、データの行から列への移動、つまりピボットと呼ばれるプロセスが必要になります。 この例では、CASE WHEN
と SUM()
.
「Bank」という名前のサンプル テーブルを考えてみましょう:
<code class="language-sql">Bank: name val amount John 1 2000 Peter 1 1999 Peter 2 1854 John 2 1888</code>
私たちの目標は、このテーブルを次の形式に変換することです:
<code class="language-sql">name amountVal1 amountVal2 John 2000 1888 Peter 1999 1854</code>
単純なケースが失敗する理由
CASE WHEN
のみを使用した単純なアプローチは次のようになります:
<code class="language-sql">SELECT name, CASE WHEN val = 1 THEN amount ELSE 0 END AS amountVal1, CASE WHEN val = 2 THEN amount ELSE 0 END AS amountVal2 FROM bank;</code>
これにより、誤った結果が生成されます:
<code class="language-sql">name amountVal1 amountVal2 John 2000 0 Peter 1999 0 John 0 1888 Peter 0 1854</code>
問題は、各行が独立して扱われることです。 結果を集計する必要があります。
SUM() による正しい解決策
解決策は、SUM()
集計関数を使用して、amount
と name
の各組み合わせの val
値を合計することです。
<code class="language-sql">SELECT name, SUM(CASE WHEN val = 1 THEN amount ELSE 0 END) AS amountVal1, SUM(CASE WHEN val = 2 THEN amount ELSE 0 END) AS amountVal2 FROM bank GROUP BY name;</code>
このクエリはピボットテーブルを正しく生成します:
<code class="language-sql">name amountVal1 amountVal2 John 2000 1888 Peter 1999 1854</code>
GROUP BY name
句は、SUM()
関数が一意の名前ごとに金額を集計することを保証します。 CASE WHEN
ステートメントは、条件付きで金額を適切な列 (amountVal1
と amountVal2
) に割り当て、指定された名前に特定の val
が存在しない場合を、デフォルト値として 0 を使用して処理します。 この手法は、SQL で列のピボットを実行するための簡潔かつ効率的な方法を提供します。
以上がCASE WHEN と SUM() を使用して SQL で列をピボットする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。