Excel 或 SQL 垂直数据到水平

Excel or SQL Vertical data to Horizontally

我从 SQL 服务器中提取了大约 5000 行的数据,如下所示。然后我将其复制粘贴到 Excel 文件中。

但我想将数据转换成这种格式:

我应该在第一步(SQL 服务器端)还是 Excel 完成这项工作?哪种解决方案更容易研究和学习?

另外,如果你能举个例子,我会很高兴。

谢谢。

如果您知道列数或最大列数,则可以将 PIVOTrow_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)