SQL行列轉換:從行轉列和列轉行方面詳解

一、SQL行轉列列轉行函數

在SQL語言中,行轉列和列轉行操作常用的函數有PIVOT和UNPIVOT函數。

1. PIVOT函數

PIVOT函數可以將數據從行轉換為列。它使用聚合函數在值上執行轉置操作,並將唯一值作為列標題。以下是一個示例:

SELECT *
FROM
(SELECT cust_id, prod_id, quantity
FROM orders)
PIVOT
(SUM(quantity)
FOR prod_id IN ([100], [200], [300], [400], [500])) as p;

上面的查詢代碼中:從orders表中查詢cust_id、prod_id和quantity三列,並使用pivot函數將prod_id列中的值以[100],[200],[300],[400],[500]為列標題轉換成列。最後結果如下:

+---------+-----+-----+-----+-----+-----+
| cust_id | 100 | 200 | 300 | 400 | 500 |
+---------+-----+-----+-----+-----+-----+
|    1    |  2  |  4  |  8  |  4  |  3  |
+---------+-----+-----+-----+-----+-----+
|    2    |  5  |  9  |  1  |  0  |  2  |
+---------+-----+-----+-----+-----+-----+

2. UNPIVOT函數

UNPIVOT函數與PIVOT函數相反,將列轉換為行。它使用UNION操作符將列轉換為行。

SELECT cust_id, prod_id, quantity
FROM
(SELECT *
FROM orders
PIVOT
(SUM(quantity)
FOR prod_id IN ([100], [200], [300], [400], [500])) as p)
UNPIVOT
(quantity
FOR prod_id IN ([100], [200], [300], [400], [500])) as u;

上面的查詢代碼中:使用PIVOT函數將prod_id列中的值以[100],[200],[300],[400],[500]為列標題轉換為列,然後使用UNPIVOT函數將列值轉換為行。最後結果如下:

+---------+---------+----------+
| cust_id | prod_id | quantity |
+---------+---------+----------+
|    1    |   100   |    2     |
+---------+---------+----------+
|    1    |   200   |    4     |
+---------+---------+----------+
|    1    |   300   |    8     |
+---------+---------+----------+
|    1    |   400   |    4     |
+---------+---------+----------+
|    1    |   500   |    3     |
+---------+---------+----------+
|    2    |   100   |    5     |
+---------+---------+----------+
|    2    |   200   |    9     |
+---------+---------+----------+
|    2    |   300   |    1     |
+---------+---------+----------+
|    2    |   400   |    0     |
+---------+---------+----------+
|    2    |   500   |    2     |
+---------+---------+----------

二、SQL行列轉換

1. SQL行轉列

SQL行轉列是指將行數據轉換為列數據。在SQL Server中可以通過UNPIVOT函數將行轉換為列。以下是示例:

SELECT cust_id, q1, q2, q3, q4, q5
FROM (SELECT cust_id, prod_id, quantity
FROM orders) p
PIVOT
(SUM(quantity)
FOR prod_id IN (q1, q2, q3, q4, q5)) as pvt;

上面的查詢代碼中:從orders表中查詢cust_id、prod_id和quantity三列,使用PIVOT函數將prod_id列中的值以q1、q2、q3、q4、q5為列標題轉換為列,最後結果如下:

+---------+----+----+----+----+----+
| cust_id | q1 | q2 | q3 | q4 | q5 |
+---------+----+----+----+----+----+
|    1    | 2  | 4  | 8  | 4  | 3  |
+---------+----+----+----+----+----+
|    2    | 5  | 9  | 1  | 0  | 2  |
+---------+----+----+----+----+----

2. SQL列轉行

SQL列轉行是指將列數據轉換為行數據。在SQL Server中可以使用UNPIVOT函數將列轉換為行。以下是示例:

SELECT cust_id, prod_id, quantity
FROM
(SELECT *
FROM orders
PIVOT
(SUM(quantity)
FOR prod_id IN ([100], [200], [300], [400], [500])) as p)
UNPIVOT
(quantity
FOR prod_id IN ([100], [200], [300], [400], [500])) as u;

上面的查詢代碼中:使用PIVOT函數將prod_id列中的值以[100],[200],[300],[400],[500]為列標題轉換為列,然後使用UNPIVOT函數將列值轉換為行。最後結果如下:

+---------+---------+----------+
| cust_id | prod_id | quantity |
+---------+---------+----------+
|    1    |   100   |    2     |
+---------+---------+----------+
|    1    |   200   |    4     |
+---------+---------+----------+
|    1    |   300   |    8     |
+---------+---------+----------+
|    1    |   400   |    4     |
+---------+---------+----------+
|    1    |   500   |    3     |
+---------+---------+----------+
|    2    |   100   |    5     |
+---------+---------+----------+
|    2    |   200   |    9     |
+---------+---------+----------+
|    2    |   300   |    1     |
+---------+---------+----------+
|    2    |   400   |    0     |
+---------+---------+----------+
|    2    |   500   |    2     |
+---------+---------+----------

三、SQL行轉列列轉行的詳細過程

1. SQL行轉列的過程

SQL行轉列是指將行數據轉換為列數據。具體步驟如下:

Step 1:從數據表中選擇需要轉換的列。

SELECT cust_id, prod_id, quantity
FROM orders

Step 2:將選擇的列作為子查詢進行聚合,生成需要轉換的數據。

SELECT cust_id, prod_id, SUM(quantity) AS QTY_total
FROM orders
GROUP BY cust_id, prod_id

Step 3:使用PIVOT函數將轉換後的數據從行轉換為列。

SELECT cust_id, [101], [102], [103], [104], [105]
FROM
(SELECT cust_id, prod_id, SUM(quantity) AS QTY_total
FROM orders
GROUP BY cust_id, prod_id) AS t
PIVOT
(SUM(QTY_total)
FOR prod_id IN ([101], [102], [103], [104], [105])) AS pvt;

2. SQL列轉行的過程

SQL列轉行是指將列數據轉換為行數據。具體步驟如下:

Step 1:從數據表中選擇需要轉換的列。

SELECT *
FROM
(SELECT cust_id, [101], [102], [103], [104], [105]
FROM orders) AS t

Step 2:使用UNPIVOT函數將列轉換為行。

SELECT cust_id, prod_id, quantity
FROM
(SELECT cust_id, [101], [102], [103], [104], [105]
FROM orders) AS t
UNPIVOT
(quantity
FOR prod_id IN ([101], [102], [103], [104], [105])) AS u;

四、SQL行轉列三種方式

1. 使用PIVOT函數

使用PIVOT函數將數據從行轉換為列,以下是示例代碼:

SELECT cust_id, [101], [102], [103], [104], [105]
FROM
(SELECT cust_id, prod_id, quantity
FROM orders) AS t
PIVOT
(SUM(quantity)
FOR prod_id IN ([101], [102], [103], [104], [105])) AS pvt;

2. 使用CASE語句和聚合函數

使用CASE語句和聚合函數將數據從行轉換為列,以下是示例代碼:

SELECT cust_id,
SUM(CASE WHEN prod_id = '101' THEN quantity ELSE 0 END) AS '101',
SUM(CASE WHEN prod_id = '102' THEN quantity ELSE 0 END) AS '102',
SUM(CASE WHEN prod_id = '103' THEN quantity ELSE 0 END) AS '103',
SUM(CASE WHEN prod_id = '104' THEN quantity ELSE 0 END) AS '104',
SUM(CASE WHEN prod_id = '105' THEN quantity ELSE 0 END) AS '105'
FROM orders
GROUP BY cust_id

3. 使用UNION ALL語句

使用UNION ALL語句將數據從行轉換為列,以下是示例代碼:

SELECT cust_id, '101' AS prod_id, [101] AS quantity
FROM
(SELECT cust_id, [101]
FROM orders) AS t
UNPIVOT
([101]
FOR prod_id IN ([101])) AS u
UNION ALL
SELECT cust_id, '102' AS prod_id, [102] AS quantity
FROM
(SELECT cust_id, [102]
FROM orders) AS t
UNPIVOT
([102]
FOR prod_id IN ([102])) AS u
UNION ALL
SELECT cust_id, '103' AS prod_id, [103] AS quantity
FROM
(SELECT cust_id, [103]
FROM orders) AS t
UNPIVOT
([103]
FOR prod_id IN ([103])) AS u
UNION ALL
SELECT cust_id, '104' AS prod_id, [104] AS quantity
FROM
(SELECT cust_id, [104]
FROM orders) AS t
UNPIVOT
([104]
FOR prod_id IN ([104])) AS u
UNION ALL
SELECT cust_id, '105' AS prod_id, [105] AS quantity
FROM
(SELECT cust_id, [105]
FROM orders) AS t
UNPIVOT
([105]
FOR prod_id IN ([105])) AS u

其中使用UNION ALL語句將多個行轉列的結果合併。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/286471.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-23 03:47
下一篇 2024-12-23 03:47

相關推薦

  • 為什麼Python不能編譯?——從多個方面淺析原因和解決方法

    Python作為很多開發人員、數據科學家和計算機學習者的首選編程語言之一,受到了廣泛關注和應用。但與之伴隨的問題之一是Python不能編譯,這給基於編譯的開發和部署方式帶來不少麻煩…

    編程 2025-04-29
  • Hibernate日誌列印sql參數

    本文將從多個方面介紹如何在Hibernate中列印SQL參數。Hibernate作為一種ORM框架,可以通過列印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29
  • 從多個方面用法介紹yes,but let me review and configure level of access

    yes,but let me review and configure level of access是指在授權過程中,需要進行確認和配置級別控制的全能編程開發工程師。 一、授權確…

    編程 2025-04-29
  • 使用SQL實現select 聚合查詢結果前加序號

    select語句是資料庫中最基礎的命令之一,用於從一個或多個表中檢索數據。常見的聚合函數有:count、sum、avg等。有時候我們需要在查詢結果的前面加上序號,可以使用以下兩種方…

    編程 2025-04-29
  • 理解Mybatis中的SQL Limit用法

    Mybatis是一種非常流行的ORM框架,提供了SQL映射配置文件,可以使用類似於傳統SQL語言的方式編寫SQL語句。其中,SQL的Limit語法是一個非常重要的知識點,能夠實現分…

    編程 2025-04-29
  • 從多個方面zmjui

    zmjui是一個輕量級的前端UI框架,它實現了豐富的UI組件和實用的JS插件,讓前端開發更加快速和高效。本文將從多個方面對zmjui做詳細闡述,幫助讀者深入了解zmjui,以便更好…

    編程 2025-04-28
  • SQL預研

    SQL預研是指在進行SQL相關操作前,通過數據分析和理解,確定操作的方法和步驟,從而避免不必要的錯誤和問題。以下從多個角度進行詳細闡述。 一、數據分析 數據分析是SQL預研的第一步…

    編程 2025-04-28
  • 學Python用什麼編輯器?——從多個方面評估各種Python編輯器

    選擇一個適合自己的 Python 編輯器並不容易。除了我們開發的應用程序類型、我們面臨的軟體架構以及我們的編碼技能之外,選擇編輯器可能也是我們編寫代碼時最重要的決定之一。隨著許多不…

    編程 2025-04-28
  • 創建列表的多個方面

    本文將從多個方面對創建列表進行詳細闡述。 一、列表基本概念 列表是一種數據結構,其中元素以線性方式組織,並且具有特殊的序列位置。該位置可以通過索引或一些其他方式進行訪問。在編程中,…

    編程 2025-04-28
  • Python在電氣自動化控制方面的應用

    本文將為大家介紹Python在電氣自動化控制方面的應用,包括基礎知識、自動化測試、數據處理、模擬模擬等方面。Python是一種高級編程語言,具有簡潔優雅的語法、豐富的功能庫和強大的…

    編程 2025-04-27

發表回復

登錄後才能評論