数据透视表从水平到垂直

时间:2018-11-29 07:34:26

标签: sql sql-server tsql pivot

我有下表的结果表

Example of current SQL table

我想要的是具有以下结构的结果表:

Final table

使用SQL可以做到吗?

谢谢。

编辑(带有示例临时表的SQL查询):

        CREATE TABLE #FINAL_STACK
        (
            FB_DATE datetime,
            FB_DESC VARCHAR(200)
        )

        INSERT INTO #FINAL_STACK(FB_DATE, FB_DESC)
        SELECT '2017-03-09', 'D - FIZ: 1'
        UNION
        SELECT '2017-03-09', 'D - PRI: 1'
        UNION      
        SELECT '2017-03-10', 'D - FIZ: 1'
        UNION
        SELECT '2017-03-10', 'D - PRI: 1'
        UNION
        SELECT '2017-03-13', 'D - FIZ: 2'
        UNION
        SELECT '2017-03-13', 'D - PRI: 1'
        UNION
        SELECT '2017-03-13', 'D - TEPAP: 1'

        SELECT * FROM #FINAL_STACK

1 个答案:

答案 0 :(得分:1)

尝试一下:

DECLARE @DynammicTSQLStatement NVARCHAR(MAX)
       ,@DynamicPIVOTColumns NVARCHAR(MAX);


SET @DynamicPIVOTColumns = STUFF
                            (
                                (
                                SELECT ',[' + CAST([FB_DATE] AS VARCHAR(12)) + ']'
                                FROM #FINAL_STACK
                                GROUP BY [FB_DATE]
                                ORDER BY [FB_DATE]
                                FOR XML PATH('') ,TYPE
                                ).value('.', 'NVARCHAR(MAX)')
                                ,1
                                ,1
                                ,''
                            );

SET @DynammicTSQLStatement = N'
SELECT *
FROM
(
SELECT *
     ,ROW_NUMBER() OVER (PARTITION BY  FB_DATE ORDER BY (SELECT 1)) AS RID
FROM #FINAL_STACK
) DS
PIVOT
(
    MAX([FB_DESC]) FOR [FB_DATE] IN (' + @DynamicPIVOTColumns + ')
) PVT';


EXEC sp_executesql @DynammicTSQLStatement;

enter image description here

我们需要执行动态数据透视,以确保它在不同的日子都可以正常使用。另外,请注意,我们正在使用ROW_NUMBER创建行ID列,以确保显示特定日期的所有记录。否则,根据PIVOT聚合函数,您将只会获得一个值(例如,最小值或最大值)。