【问题标题】:Pivoting a table in SQL Server在 SQL Server 中透视表
【发布时间】:2015-10-29 03:46:05
【问题描述】:

假设我有以下表格的摘录

Name    Dept        Shift   Time    Date        Section
------- ----------- ------- ------- ----------- -------
GAN     BREAKER     Day     8-10    2015-10-27  NULL
GAN     BREAKER     Day     10-12   2015-10-27  NULL
GAN     BREAKER     Day     12-2    2015-10-27  Stone
GAN     BREAKER     Day     2-4     2015-10-27  NULL
GAN     BREAKER     Day     4-6     2015-10-27  NULL
GAN     BREAKER     Day     6-8     2015-10-27  NULL
GAN     BREAKER     Night   8-10    2015-10-27  NULL
GAN     BREAKER     Night   10-12   2015-10-27  NULL
GAN     BREAKER     Night   12-2    2015-10-27  NULL
GAN     BREAKER     Night   2-4     2015-10-27  NULL
GAN     BREAKER     Night   4-6     2015-10-27  Wall
GAN     BREAKER     Night   6-8     2015-10-27  NULL

我想进行旋转,使其看起来像这样:

                            2015-10-27
Name    Dept        Shift   8-10    10-12   12-2    2-4     4-6     6-8
------- ----------- ------- ------- ------- ------- ------- ------- ------
GAN     BREAKER     Day     NULL    NULL    Stone   NULL    NULL    NULL
GAN     BREAKER     Night   NULL    NULL    NULL    NULL    Wall    NULL

或者可能是接近上述建议的枢轴的东西。

可以在 SQL Server 中完成吗?有人可以指出我对此的正确查询吗?

感谢你们的关注! :)

【问题讨论】:

    标签: sql-server sql-server-2012 pivot pivot-table


    【解决方案1】:

    公平地说,这有点懒惰。我以前从未使用过 SQL Server,也没有听说过 PIVOT。在 5 分钟内,我已经学到了足够的知识,可以传授给你,让你接管。下次做更多的研究。

    是的,Google 说 SQL Server 有PIVOT 功能。所以...

    SELECT * FROM Table1
    PIVOT(
      MIN([section]) 
      FOR [time]
      IN ([8-10],[10-12],[12-2],[4-6],[6-8])
    ) AS shiftTimes
    

    输出:

    Name | Dept     | Shift    | Date         | 8-10   | 10-12   | 12-2   | 4-6    | 6-8
    ----------------------------------------------------------------------------------------
    GAN  | BREAKER  | Day      | 2015-10-27   | (null) | (null)  | Stone  | (null) | (null)
    GAN  | BREAKER  | Night    | 2015-10-27   | (null) | (null)  | (null) | Wall   | (null)
    

    DEMO

    ...非常非常接近您想要的输出。也许通过一些调整和一些研究,你可以找到完美的输出。我可能会用另外 5 个完成它,但我会把它留给你。

    在这里,我假设您的班次模式 (8-10) 将始终相同,因此我手动输入了它们。如果将来它们可能会发生变化,我肯定会考虑使用像 Paul 的回答这样的动态支点。

    他的回答与我的不同之处在于易于维护和性能。根据你给我们的小数据集,我的查询很容易阅读,运行时间为 0.38 毫秒,而他的为 0.5 毫秒。但是,这不是关于那个,而是关于您是否需要动态创建新列。如果你不这样做,请使用我的。如果你这样做,请使用他的。

    享受吧。

    【讨论】:

    • 嗨狗仔队。感谢您的关注。非常欣赏它。下次会做并付出更多的努力。
    【解决方案2】:

    尝试动态枢轴,

    CREATE TABLE #Your_Table
    (
        NAME VARCHAR(10),
        DEPT VARCHAR(20),
        [SHIFT] VARCHAR(10),
        [TIME] VARCHAR(50),
        [DATE] DATE,
        SECTION VARCHAR(50)
    )
    
    INSERT INTO #Your_Table
    VALUES      ('GAN','BREAKER','Day','8-10','2015-10-27',NULL),
                ('GAN','BREAKER','Day','10-12','2015-10-27',NULL),
                ('GAN','BREAKER','Day','12-2','2015-10-27','Stone'),
                ('GAN','BREAKER','Day','2-4','2015-10-27',NULL),
                ('GAN','BREAKER','Day','4-6','2015-10-27',NULL),
                ('GAN','BREAKER','Day','6-8','2015-10-27',NULL),
                ('GAN','BREAKER','Night','8-10','2015-10-27',NULL),
                ('GAN','BREAKER','Night','10-12','2015-10-27',NULL),
                ('GAN','BREAKER','Night','12-2','2015-10-27',NULL),
                ('GAN','BREAKER','Night','2-4','2015-10-27',NULL),
                ('GAN','BREAKER','Night','4-6','2015-10-27','Wall'),
                ('GAN','BREAKER','Night','6-8','2015-10-27',NULL)
    
    DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
    DECLARE @ColumnName AS NVARCHAR(MAX)
    
    --Get distinct values of the PIVOT Column 
    SELECT @ColumnName = ISNULL(@ColumnName + ',', '')
                         + Quotename([TIME])
    FROM   (SELECT DISTINCT [TIME]
            FROM   #Your_Table) AS Courses
    --Prepare the PIVOT query using the dynamic 
    SET @DynamicPivotQuery = N'SELECT Name, Dept,[Shift], '
                             + @ColumnName + 'FROM #Your_Table PIVOT(MAX(SECTION) FOR [TIME]
              IN ('+ @ColumnName + ')) AS PVTTable'
    
    --Execute the Dynamic Pivot Query
    EXEC SP_EXECUTESQL
      @DynamicPivotQuery 
    

    SQLFIDDLE DEMO

    【讨论】:

    • 我为您添加了一个有效的 SQLFiddle 演示。我已经用这个数据集打开了一个:)
    • 嗨,保罗。感谢您的建议:) 这也有效
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    相关资源
    最近更新 更多