首頁 >資料庫 >mysql教程 >如何在不使用聚合函數的情況下透視表?

如何在不使用聚合函數的情況下透視表?

Barbara Streisand
Barbara Streisand原創
2025-01-20 09:47:08420瀏覽

How Can I Pivot a Table Without Using Aggregate Functions?

無需聚合函數的透視表資料轉換

在資料處理領域,有時需要將資料重塑成更容易使用者使用或更方便分析的格式。實現此目標最常用的技術之一是透視,其中資料被轉換為更寬的佈局。雖然透視通常涉及聚合值,但也可以在不使用任何聚合函數的情況下執行此操作。

考慮下表:

<code class="language-sql">CREATE TABLE Data (
  CustomerID int,
  DBColumnName varchar(50),
  Data varchar(50)
);

INSERT INTO Data (CustomerID, DBColumnName, Data)
VALUES
  (1, 'FirstName', 'Joe'),
  (1, 'MiddleName', 'S'),
  (1, 'LastName', 'Smith'),
  (1, 'Date', '12/12/2009'),
  (2, 'FirstName', 'Sam'),
  (2, 'MiddleName', 'S'),
  (2, 'LastName', 'Freddrick'),
  (2, 'Date', '1/12/2009'),
  (3, 'FirstName', 'Jaime'),
  (3, 'MiddleName', 'S'),
  (3, 'LastName', 'Carol'),
  (3, 'Date', '12/1/2009');</code>

此表包含多個客戶的數據,其中每筆記錄代表一個特定屬性(FirstName、MiddleName、LastName、Date)及其關聯的值。目標是將此資料透視成更易讀的格式:

<code class="language-sql">CREATE TABLE PivotedData (
  CustomerID int,
  FirstName varchar(50),
  MiddleName varchar(50),
  LastName varchar(50),
  Date varchar(50)
);

INSERT INTO PivotedData (CustomerID, FirstName, MiddleName, LastName, Date)
VALUES
  (1, 'Joe', 'S', 'Smith', '12/12/2009'),
  (2, 'Sam', 'S', 'Freddrick', '1/12/2009'),
  (3, 'Jaime', 'S', 'Carol', '12/1/2009');</code>

要注意的是,此轉換聚合資料。相反,它保留了每個客戶每個屬性的唯一值。

為了在不使用聚合函數的情況下實現此轉換,我們可以在分組的 SELECT 語句中使用 CASE 表達式:

<code class="language-sql">SELECT
  CustomerID,
  MIN(CASE DBColumnName WHEN 'FirstName' THEN Data END) AS FirstName,
  MIN(CASE DBColumnName WHEN 'MiddleName' THEN Data END) AS MiddleName,
  MIN(CASE DBColumnName WHEN 'LastName' THEN Data END) AS LastName,
  MIN(CASE DBColumnName WHEN 'Date' THEN Data END) AS Date
FROM Data
GROUP BY CustomerID;</code>

此查詢使用一系列 CASE 運算式有條件地為每個客戶選擇與每個屬性關聯的值。 MIN() 函數用於檢索符合指定條件的單一值,確保我們每個屬性只包含一個值。透過按 CustomerID 分組結果,我們為每個客戶建立一行,其中包含其對應的屬性和值。

此技術允許靈活地透視數據,而無需使用聚合函數。當資料需要最小轉換並且需要保留原始值時,它特別有用。

以上是如何在不使用聚合函數的情況下透視表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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