【问题标题】:SQL Pivot Issue, Need dynamic column namesSQL Pivot 问题,需要动态列名
【发布时间】:2015-11-06 21:17:08
【问题描述】:

好的。所以我们需要使用下面的代码来获得输出。我的大部分代码来自:Convert Rows to columns using 'Pivot' in SQL Server。这给了我这些年的动态列名,然后计算每年的事件。我需要(或至少希望)将列名格式化为 FY 2014 Total 等,而不仅仅是 2014 年。因此创建了另一个列名列表以用作输出名称。我认为在进行数据透视时,您将为新列提供自定义名称。我不确定我需要做什么。

DECLARE @colValues as NVARCHAR(MAX),
        @colNames as NVARCHAR(MAX),
        @query as NVARCHAR(MAX)

--Creates the column names dynamically from the FY results
select @colValues = STUFF((
                                         SELECT ',' + QUOTENAME(FY)
                                         From [dbo].[Table]
                                         Group By FY
                                         Order By FY desc
                                  for xml path(''), TYPE
                                  ).value('.', 'NVARCHAR(MAX)'),1,1,'')
select @colNames = STUFF((
                                         SELECT ',' + '[FY ' + Cast(FY as NVARCHAR(4)) + ' Total]'
                                         From [dbo].[Table]
                                         Group By FY
                                         Order By FY desc
                                  for xml path(''), TYPE
                                  ).value('.', 'NVARCHAR(MAX)'),1,1,'')
--print(@cols)

--Creates the SQL Query using pivot with the dynamic columns
set @query = '
                       with temp1 as
                       (
                             Select a.EventType,
                                         a.Days_Since_Last_Event,
                                         row_number() over (partition by a.EventType order by a.Days_Since_Last_Event) as ranking
                             From 
                             (
                                    SELECT EventType
                                           ,DATEDIFF(day,EventDate,GETDATE()) AS Days_Since_Last_Event
                                    FROM [dbo].[Table]
                              ) a join 
                             (
                                    SELECT EventType
                                           ,DATEDIFF(day,EventDate,GETDATE()) AS Days_Since_Last_Event
                                    FROM [dbo].[Table]
                              ) b on a.EventType = b.EventType and a.Days_Since_Last_Event = b.Days_Since_Last_Event
                       ), temp3 as
                       (             
                           select EventType,
                                     Days_Since_Last_Event
                           from temp1
                           where ranking = 1
                       ), temp2 as
                       (
                             Select EventType
                                         ,'+ @colNames + '
                             From 
                             (
                                  Select EventType, FY, 1 as thing
                                  From [dbo].[Table]
                             ) a
                             Pivot
                             (
                                  Count(thing)
                                  for FY in (' + @colValues + ')
                             ) b
                       )

                           Select t3.*, '+ @colNames +'
                           From temp3 t3 
                                  join temp2 t2 on t3.EventType = t2.EventType'


execute(@query);

【问题讨论】:

    标签: sql-server pivot pivot-table


    【解决方案1】:

    在两个地方的 temp2 cte 中使用 @colValues。然后在最终选择中使用它。

    select @colNames = STUFF((
                                     SELECT ',' + QUOTENAME(FY) + ' AS [FY ' + Cast(FY as NVARCHAR(4)) + ' Total]'  
                                     From [dbo].[Table]
                                     Group By FY
                                     Order By FY desc
                               for xml path(''), TYPE
                              ).value('.', 'NVARCHAR(MAX)'),1,1,'')
    

    应该给你这样的东西..

    DECLARE @colValues as NVARCHAR(MAX),
            @colNames as NVARCHAR(MAX),
            @query as NVARCHAR(MAX)
    
    --Creates the column names dynamically from the FY results
    select @colValues = STUFF((
                                SELECT ',' + QUOTENAME(FY)
                                From [dbo].[Table]
                                Group By FY
                                Order By FY desc
                        for xml path(''), TYPE
                        ).value('.', 'NVARCHAR(MAX)'),1,1,'')
    select @colNames = STUFF((
                               SELECT ',' + QUOTENAME(FY) + ' AS [FY ' + Cast(FY as NVARCHAR(4)) + ' Total]'
                               From [dbo].[Table]
                               Group By FY
                               Order By FY desc
                       for xml path(''), TYPE
                       ).value('.', 'NVARCHAR(MAX)'),1,1,'')
    --Creates the SQL Query using pivot with the dynamic columns
    set @query = '
    with temp1 as
    (
            Select a.EventType,
                        a.Days_Since_Last_Event,
                        row_number() over (partition by a.EventType order by a.Days_Since_Last_Event) as ranking
            From 
            (
                SELECT EventType
                        ,DATEDIFF(day,EventDate,GETDATE()) AS Days_Since_Last_Event
                FROM [dbo].[Table]
            ) a join 
            (
                SELECT EventType
                        ,DATEDIFF(day,EventDate,GETDATE()) AS Days_Since_Last_Event
                FROM [dbo].[Table]
            ) b on a.EventType = b.EventType and a.Days_Since_Last_Event = b.Days_Since_Last_Event
    ), temp3 as
    (             
        select EventType,
                    Days_Since_Last_Event
        from temp1
        where ranking = 1
    ), temp2 as
    (
            Select EventType
                        ,'+ @colValues + '
            From 
            (
                Select EventType, FY, 1 as thing
                From [dbo].[Table]
            ) a
            Pivot
            (
                Count(thing)
                for FY in (' + @colValues + ')
            ) b
    )
    
        Select t3.*, '+ @colNames +'
        From temp3 t3 
                join temp2 t2 on t3.EventType = t2.EventType'
    
    
    execute(@query);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 2016-10-04
      • 1970-01-01
      相关资源
      最近更新 更多