首頁 >資料庫 >mysql教程 >如何使用 CASE WHEN 和 SUM() 在 SQL 中透視列?

如何使用 CASE WHEN 和 SUM() 在 SQL 中透視列?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-11 15:51:46707瀏覽

How to Pivot a Column in SQL Using CASE WHEN and SUM()?

使用 CASE WHEN 和 SUM() 在 SQL 中透視列

資料轉換通常需要重塑表格,將資料從行移動到列中,這個過程稱為資料透視。 此範例示範如何使用 CASE WHENSUM().

在 SQL 中旋轉列

讓我們考慮一個名為「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() 聚合函數對每個 amountname 組合的 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 語句有條件地將金額分配給適當的列(amountVal1amountVal2),透過使用 0 作為預設值來處理給定名稱缺少特定 val 的情況。 該技術提供了一種在 SQL 中執行列透視的簡潔有效的方法。

以上是如何使用 CASE WHEN 和 SUM() 在 SQL 中透視列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn