首页 > 解决方案 > 在 SQL Server 中将列中的数据转换为行

问题描述

对SQL相当陌生,所以我很抱歉!

目前我有以下 SQL 查询:

select [data]
from Database1.dbo.tbl_Data d
join Database1.tbl_outbound o on d.session_id = o.session_id
where o.campaign_id = 1047
  and d.session_id = 12

这将返回一列,如下所示(并且它可以返回不同的行数,具体取决于campaign_idsession_id!):

    [data]

[1] Entry 1
[2] Entry 2
[3] Entry 3
[4] Entry 4
[5] Entry 5
    .....
[98] Entry 98
[99] Entry 99

我想转换数据,使它们显示在 1 行而不是 1 列中,例如:

    [data1]  [data2]  [data3]  [data4]  [data5] .... [data98]  [data99]

[1] Entry 1  Entry 2  Entry 3  Entry 4  Entry 5 .... Entry 98  Entry 99

我希望我已经解释得足够好!谢谢!:)

我已经看到一些关于 Pivot 和 Unpivot 的信息,但无法让它发挥作用!

标签: sqlsql-serverpivot

解决方案


试试这个有助于您要求的动态 sql

IF OBJECT_ID('tempdb..#Temp')IS NOT NULL
DROP TABLE #Temp
CREATE TABLE #Temp (data VARCHAR(100))
GO
IF OBJECT_ID('tempdb..#FormatedTable')IS NOT NULL
DROP TABLE #FormatedTable
Go

INSERT INTO #Temp(data)
SELECT  'Entry1' UNION ALL
SELECT  'Entry2' UNION ALL
SELECT  'Entry3' UNION ALL
SELECT  'Entry4' UNION ALL
SELECT  'Entry5'

SELECT ROW_NUMBER()OVER(ORDER BY Data) AS SeqId, 
        Data,
        'Data'+CAST(ROW_NUMBER()OVER(ORDER BY Data) AS VARCHAR(100)) AS ReqColumn
INTO #FormatedTable
FROM #Temp

DECLARE  @Sql nvarchar(max),
         @DynamicColumn nvarchar(max),
         @MaxDynamicColumn nvarchar(max)


SELECT @DynamicColumn = STUFF((SELECT  ', '+QUOTENAME(ReqColumn)
FROM #FormatedTable  FOR XML PATH ('')),1,1,'') 

SELECT @MaxDynamicColumn = STUFF((SELECT  ', '+'MAX('+(ReqColumn)+') AS '+QUOTENAME(CAST(ReqColumn AS VARCHAR(100)))
FROM #FormatedTable   FOR XML PATH ('')),1,1,'') 

SET @Sql=' SELECT ROW_NUMBER()OVER(ORDER BY (SELECT 1)) AS SeqId, '+ @MaxDynamicColumn+'
            FROM
            (
            SELECT * FROM #FormatedTable
            ) AS src
            PIVOT 
            (
            MAX(Data) FOR [ReqColumn] IN ('+@DynamicColumn+')
            ) AS Pvt
            '
EXEC (@Sql)
PRINT @Sql

结果


SeqId   Data1   Data2   Data3   Data4   Data5
----------------------------------------------
1       Entry1  Entry2  Entry3  Entry4  Entry5

推荐阅读