【问题标题】:Transpose table - Pivot SQL Server 2016转置表 - 透视 SQL Server 2016
【发布时间】:2017-10-23 13:29:10
【问题描述】:

我有一张如下所示的表格: SourceTable

CREATE TABLE [Temp].[tblMyleneTest]
(
    [DispOrder] [INT] NULL,
    [ReferencePeriod] [VARCHAR](7) NULL,
    [TypeOfGSUF] [VARCHAR](8) NULL,
    [FactAllocReferencePeriod] [VARCHAR](4) NULL,
    [Variable] [VARCHAR](50) NULL,
    [Value] [INT] NULL 
) ON [PRIMARY]


INSERT INTO [Temp].[tblMyleneTest]
VALUES (1, '201710F', 'Reduced', '2015', 'OperatingEntityNumberCount', '13540688'),
       (2, '201710F', 'Reduced', '2015', 'EnterpriseCodeCount', '6041138'),
       (3, '201710F', 'Reduced', '2015', 'EstablishmentCodeCount', '6554081'),
       (4, '201710F', 'Reduced', '2015', 'LocationCodeCount', '6600130'),
       (5, '201710F', 'Reduced', '2015', 'NAICSNotNullCount', '9943634'),
       (6, '201710F', 'Reduced', '2015', 'ReportingEntityNumbeCount', '2608'),
       (7, '201710F', 'Reduced', '2015', 'LocationCode_NotEverAliveCount', '2339'),
       (8, '201710F', 'Reduced', '2015', 'OperatingEntityNumberCountFF', '3078'),
       (1, '201706F', 'Reduced', '2014', 'OperatingEntityNumberCount', '13557946'),
       (2, '201706F', 'Reduced', '2014', 'EnterpriseCodeCount', '6046857'),
       (3, '201706F', 'Reduced', '2014', 'EstablishmentCodeCount', '6560136'),
       (4, '201706F', 'Reduced', '2014', 'LocationCodeCount', '6606226'),
       (8, '201706F', 'Reduced', '2014', 'OperatingEntityNumberCountFF', '3078')

我希望将 ReferencePeriodFactAllocReferencePeriodTypeOfGSUF 分组。如您所见,具有相同变量名称的 2 条记录。 ReferencePeriod 201710F 和另一个 201706F。我希望这些计数并排。我想要这样的东西:

Result Table

我可以旋转表格以将ReferencePeriod 向上移动。但不是相关的 FactAllocReferencePeriod/TypeOfGSUF...

SELECT * 
FROM [Temp].[tblMyleneTest]
PIVOT (MAX(value) FOR ReferencePeriod IN ([201710F], [201706F])) p

你能帮我解决这个问题吗?

【问题讨论】:

  • 第一个问题的出色工作。看到人们发布表格以及示例数据总是很棒。以及发布所需结果的奖励积分。

标签: sql sql-server pivot transpose


【解决方案1】:

引用this answer on pivoting rows into columns

SELECT
    [Variable], piv.[201706F], piv.[201710F]
FROM 
(
    select [DispOrder], [Variable], [ReferencePeriod], [Value] from  #tblMyleneTest
) src
PIVOT (
    MAX([Value])
    FOR ReferencePeriod IN ([201710F],[201706F])
) piv

按 [DispOrder] 排序

【讨论】:

    【解决方案2】:

    我会为此使用条件聚合而不是枢轴。语法对我来说不那么迟钝。

    select variable
        , R201710f = max(case when ReferencePeriod = '201710F' then Value end)
        , F201706f = max(case when ReferencePeriod = '201706F' then Value end)
    from tblMyleneTest
    group by variable
    order by variable
    

    【讨论】:

    • 是的,可以。但我正在失去价值!但我想我可以更新转置表以添加缺少的 2 行...
    • 你正在失去价值是什么意思?没有查询能够像您在示例中那样为......好吧......谁知道这些数据来自哪里的行组成数据。
    【解决方案3】:

    result

    我正在丢失 TypeOfGSUF 和 FactAllocReferencePeriod...

    【讨论】:

      【解决方案4】:

      这是我的最后一段代码:

          -- Transpose tblSUFGenericCountsReportYYYYMM to get proper display --
      SET @p_SQLCMD  = N' DROP TABLE IF EXISTS ' + @p_SUFReportTable + '' 
                     + N' SELECT [DispOrder], [Variable], piv.[' + @p_ReferencePeriod2 + '], piv.[' + @p_ReferencePeriod1 + '] '
                     + N' INTO ' + @p_SUFReportTable + ' from ( '
                     + N' SELECT [DispOrder], [Variable], [ReferencePeriod], [Value] FROM  Temp.tblSUFGenericCountsReport ) src '
                     + N' PIVOT ( MAX([Value]) FOR ReferencePeriod IN ([' + @p_ReferencePeriod1 + '],[' + @p_ReferencePeriod2 + ']) ) piv'
                     + N' ORDER BY [DispOrder];'
      
      EXEC sp_executesql @statement = @p_SQLCMD
      

      然后添加缺失值:

      -- Insert the TypeOfGSUF and FactorAllocationReferenceYear values to the report --
      SET @p_SQLCMD  = N' INSERT INTO '+ @p_SUFReportTable +' (DispOrder, variable, "'+ @p_ReferencePeriod2 +'", "'+ @p_ReferencePeriod1 +'", Flag)'
                     + N' VALUES (0 ,''TYPE OF GSUF'', "'+ @p_SUFMonthReduced +'", "'+ @p_SUFMonthReduced +'", Null),'
                     + N' (1 ,''T4 RY used for allocation view'', ' + @p_PrevFactAllocReferencePeriod + ', ' + @p_FactAllocReferencePeriod + ', Null) ;'
      
      PRINT @p_SQLCMD
      EXEC sp_executesql @statement = @p_SQLCMD
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多