2015-11-06 43 views
-1

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

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); 

回答

0

在您的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);