Excel 或 SQL 垂直数据到水平
Excel or SQL Vertical data to Horizontally
我从 SQL 服务器中提取了大约 5000 行的数据,如下所示。然后我将其复制粘贴到 Excel 文件中。
但我想将数据转换成这种格式:
我应该在第一步(SQL 服务器端)还是 Excel 完成这项工作?哪种解决方案更容易研究和学习?
另外,如果你能举个例子,我会很高兴。
谢谢。
如果您知道列数或最大列数,则可以将 PIVOT
与 row_number()
一起使用
如果最大值未知,则需要动态 SQL
示例或dbFiddle
Select *
From (
Select A.ID
,B.*
from (Select *
,Grp = row_number() over (partition by ID order by ID)
From YourTable
) A
Cross Apply ( values (concat('Column1-',Grp),Column1)
,(concat('Column2-',Grp),Column2)
,(concat('Column3-',Grp),Column3)
,(concat('Column4-',Grp),Column4)
) B(Col,Val)
) src
Pivot (max(Val) for Col in ( [Column1-1]
,[Column2-1]
,[Column3-1]
,[Column4-1]
,[Column1-2]
,[Column2-2]
,[Column3-2]
,[Column4-2]
,[Column1-3]
,[Column2-3]
,[Column3-3]
,[Column4-3]
) ) pvt
结果
编辑 - 更新动态 SQL 和变量数据类型
Declare @SQL varchar(max) = (
Select string_agg(concat('[',Col,N,']'),',') within group (order by N,Col)
From (values ('Column1-')
,('Column2-')
,('Column3-')
,('Column4-')
) A(Col)
Cross Join ( Select distinct N=row_number() over (partition by ID order by ID) From YourTable ) B
)
Set @SQL = '
Select *
From (Select A.ID
,B.*
from (Select *
,Grp = row_number() over (partition by ID order by ID)
From YourTable
) A
Cross Apply ( Select col = concat([Key],''-'',Grp)
,Val = value
From OpenJson((Select A.* For JSON Path,Without_Array_Wrapper ))
) B
) src
Pivot (max(Val) for Col in ( '+@SQL+' ) ) pvt '
Exec(@SQL)
我从 SQL 服务器中提取了大约 5000 行的数据,如下所示。然后我将其复制粘贴到 Excel 文件中。
但我想将数据转换成这种格式:
我应该在第一步(SQL 服务器端)还是 Excel 完成这项工作?哪种解决方案更容易研究和学习?
另外,如果你能举个例子,我会很高兴。
谢谢。
如果您知道列数或最大列数,则可以将 PIVOT
与 row_number()
如果最大值未知,则需要动态 SQL
示例或dbFiddle
Select *
From (
Select A.ID
,B.*
from (Select *
,Grp = row_number() over (partition by ID order by ID)
From YourTable
) A
Cross Apply ( values (concat('Column1-',Grp),Column1)
,(concat('Column2-',Grp),Column2)
,(concat('Column3-',Grp),Column3)
,(concat('Column4-',Grp),Column4)
) B(Col,Val)
) src
Pivot (max(Val) for Col in ( [Column1-1]
,[Column2-1]
,[Column3-1]
,[Column4-1]
,[Column1-2]
,[Column2-2]
,[Column3-2]
,[Column4-2]
,[Column1-3]
,[Column2-3]
,[Column3-3]
,[Column4-3]
) ) pvt
结果
编辑 - 更新动态 SQL 和变量数据类型
Declare @SQL varchar(max) = (
Select string_agg(concat('[',Col,N,']'),',') within group (order by N,Col)
From (values ('Column1-')
,('Column2-')
,('Column3-')
,('Column4-')
) A(Col)
Cross Join ( Select distinct N=row_number() over (partition by ID order by ID) From YourTable ) B
)
Set @SQL = '
Select *
From (Select A.ID
,B.*
from (Select *
,Grp = row_number() over (partition by ID order by ID)
From YourTable
) A
Cross Apply ( Select col = concat([Key],''-'',Grp)
,Val = value
From OpenJson((Select A.* For JSON Path,Without_Array_Wrapper ))
) B
) src
Pivot (max(Val) for Col in ( '+@SQL+' ) ) pvt '
Exec(@SQL)