一、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