如何在 sql 服务器 2005 中将一行拆分为多行

how to split one row into multiple rows in sql server 2005

我有 table 看起来像这样

Col1     col2    col3     col4        col5
---------------------------------------------
data1    data2   data3    data4       data5

我想将该记录显示为

heading1      heading2
----------------------
Col1          data1
Col2          data2
col3          data3
col4          data4
col5          data5

看这个小例子:

SELECT * INTO T FROM
(VALUES
(1,2,3)
) T(A,B,C)

SELECT * FROM T

基地table:

A B C
- - -
1 2 3

逆轴:

SELECT * FROM T
UNPIVOT (X FOR Y IN (A,B,C)) U

结果

X Y
- -
1 A
2 B
3 C

您可以使用 UNPIVOT 来实现:

select P.Heading1, P.Heading2
from Temp T
unpivot
(
  Heading2
  for Heading1 in (Col1,col2,col3,col4, col5)
) P;

可以找到更多信息 here

示例数据

IF OBJECT_ID('dbo.TempData') IS NOT NULL
DROP TABLE TempData
;With cte(Col1,Col2,Col3,Col4,Col5)
AS
(
SELECT 'data1','data2','data3','data4','data5'
)
SELECT * INTO TempData FROM cte

SELECT  * FROM TempData

使用交叉应用动态 Sql

DECLARE @Sql NVARCHAR(MAX) , @dynCoulmn NVARCHAR(MAX)

SELECT @dynCoulmn=STUFF((SELECT distinct ', '+TempCol  FROM
(
SELECT '('+COLUMN_NAME+','+''''+COLUMN_NAME+''''+')' AS TempCol
 FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='TempData'
)dt2
FOR XML PATH ('')),1,1,'')

SET @Sql=' 
SELECT heading1,heading2 FROM TempData
CROSS APPLY ( Values '+@dynCoulmn+'
            ) A (heading2,heading1)
            '
PRINT @Sql
EXEC (@Sql)

交叉应用前的结果

Col1    Col2    Col3    Col4    Col5
-------------------------------------
data1   data2   data3   data4   data5

结果后交叉应用

heading1    heading2
---------------------
Col1         data1
Col2         data2
Col3         data3
Col4         data4
Col5         data5