SQL列轉行詳解

一、SQL列轉行函數

SQL列轉行是指將一行中的多個列轉成多行,使得每一行只有一個數據列。為了實現這一目標,我們可以使用UNPIVOT操作符和CROSS APPLY運算符。

SELECT *
FROM   (SELECT col1, col2, col3
        FROM   mytable) p
UNPIVOT (value FOR colname IN (col1, col2, col3)) AS unpvt
CROSS APPLY (SELECT 'col1' AS colname
             UNION ALL
             SELECT 'col2'
             UNION ALL
             SELECT 'col3') colnames
WHERE  colnames.colname = unpvt.colname;

在上述代碼中,我們首先使用子查詢返回指定表格的列。接下來使用UNPIVOT將每個列的值轉換為行,並使用CROSS APPLY添加一個列名的列。最後使用WHERE過濾出正確的行。

二、SQL列轉行可以只轉一部分

如果我們想僅僅將表格的指定列轉換為行,可以使用如下代碼:

SELECT *
FROM   (SELECT col1, col2, col3
        FROM   mytable) p
UNPIVOT (value FOR colname IN (col2, col3)) AS unpvt
CROSS APPLY (SELECT 'col2' AS colname
             UNION ALL
             SELECT 'col3') colnames
WHERE  colnames.colname = unpvt.colname;

在這個示例中,我們只轉換了第二個和第三個列(col2和col3)。這是通過在第12行中對UNPIVOT操作符傳遞col2和col3作為列名的方法實現的。

三、SQL列轉行語句

通常,在SQL中,我們可以使用SELECT語句來轉換列為行。

SELECT Col1, 'Col2' as ColumnName, Col2 from TableName
UNION ALL
SELECT Col1, 'Col3' as ColumnName, Col3 from TableName
UNION ALL
SELECT Col1, 'Col4' as ColumnName, Col4 from TableName
UNION ALL
SELECT Col1, 'Col5' as ColumnName, Col5 from TableName

上述SQL語句會將某個表格中的Col2、Col3、Col4和Col5轉換為行。每個UNION子查詢都包含一個SELECT語句,該語句將指定的列的值作為單行返回。

四、SQL列轉行 map

如果我們需要將多個列轉換為單個行,可以使用如下代碼進行轉換:

SELECT Col1,
       Stuff((SELECT ', ' + Cast(Col2 as varchar(10)) FROM TableName 
              WHERE Col1 = t.Col1
              FOR XML PATH('')), 1, 2, '') Col2
FROM TableName t
GROUP BY Col1

在上述代碼示例中,我們首先使用GROUP BY子句分組列,然後使用Stuff函數將多個列的值連接為單個行。注意,我們使用Cast函數將Col2的值轉換為varchar類型。

五、MySQL列轉行函數

如果我們使用MySQL數據庫,可以使用GROUP_CONCAT函數將多個列合併為單個行:

SELECT Col1, GROUP_CONCAT(Col2 SEPARATOR ', ') AS Col2
FROM TableName
GROUP BY Col1;

在上述代碼示例中,我們使用GROUP_CONCAT函數將Col2的值與逗號分隔符連接為單個行。

六、MySQL列轉行的方法

下面的代碼示例展示了一種基於MySQL PIVOT表的方法,將列轉換為行:

SELECT ColumnHeader, 
       IF(ColumnName = 'Col2', Col2, NULL) AS Col2, 
       IF(ColumnName = 'Col3', Col3, NULL) AS Col3,
       IF(ColumnName = 'Col4', Col4, NULL) AS Col4,
       IF(ColumnName = 'Col5', Col5, NULL) AS Col5
FROM (SELECT 'Col2' AS ColumnName UNION ALL
      SELECT 'Col3' UNION ALL
      SELECT 'Col4' UNION ALL
      SELECT 'Col5'
     ) colnames
LEFT JOIN (SELECT 'Col2' AS ColumnName, Col2 FROM TableName UNION ALL
           SELECT 'Col3', Col3 FROM TableName UNION ALL
           SELECT 'Col4', Col4 FROM TableName UNION ALL
           SELECT 'Col5', Col5 FROM TableName
          ) pvt
ON colnames.ColumnName = pvt.ColumnName;

在上述代碼示例中,我們使用UNION ALL和SELECT語句來返回要轉換的列。然後使用LEFT JOIN將映射到每個列名的值組合成一個單獨的行。

七、SQL Server列轉行

如果我們想在SQL Server中將列轉換為行,可以使用如下代碼:

SELECT Col1, 'Col2' ColumnName, Col2
FROM TableName
UNION ALL
SELECT Col1, 'Col3' ColumnName, Col3 
FROM TableName
UNION ALL
SELECT Col1, 'Col4' ColumnName, Col4 
FROM TableName
UNION ALL 
SELECT Col1, 'Col5' ColumnName, Col5 
FROM TableName;

在這個示例中,我們只是使用UNION ALL將指定的列連接到單個查詢結果中。在結果中,每個行都包含Col1列中的值和特定的列的值。

八、SQL列轉行查詢

下面的代碼示例展示了一種使用UNION ALL和SELECT語句將列轉換為行的方法:

SELECT Col1, 'Col2' AS ColumnName, Col2 AS ColumnValue
FROM TableName
UNION ALL
SELECT Col1, 'Col3', Col3
FROM TableName
UNION ALL
SELECT Col1, 'Col4', Col4
FROM TableName
UNION ALL
SELECT Col1, 'Col5', Col5
FROM TableName;

在上述代碼示例中,我們使用UNION ALL將每個SELECT語句的結果連接到單個結果集中。注意,我們在每個SELECT語句中都指定了ColumnName和ColumnValue列。

九、SQL列轉行最簡單的方法

最簡單的列轉行技術是將所有列通過UNION ALL合併到一個列中:

SELECT Col1, Col2 AS ColValue
FROM TableName
UNION ALL
SELECT Col1, Col3 AS ColValue
FROM TableName
UNION ALL
SELECT Col1, Col4 AS ColValue
FROM TableName
UNION ALL
SELECT Col1, Col5 AS ColValue
FROM TableName;

在上述代碼示例中,我們只是使用SELECT語句將每個列轉換為單個行。在每一行中,我們使用AS關鍵字將列值指定為一個名為ColValue的列。

十、SQL列轉行逗號連接

有時候,我們希望將多個列的值連接起來,形成一個逗號分隔的字符串。要做到這一點,可以使用如下代碼:

SELECT Col1,
       Stuff((SELECT ', ' + Col2
              FROM TableName 
              WHERE Col1 = t.Col1
              FOR XML PATH('')), 1, 2, '') AS Col2
FROM TableName t
GROUP BY Col1

在上述代碼示例中,我們使用GROUP BY子句分組列,然後使用Stuff函數將多個列的值連接為單個行。注意,在這個示例中,我們沒有顯式轉換列,而是直接連接列值。

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

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

相關推薦

  • Hibernate日誌打印sql參數

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

    編程 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
  • SQL預研

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

    編程 2025-04-28
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25

發表回復

登錄後才能評論