2015-11-06 5 views
-1

Хорошо. Таким образом, нам нужно было получить выход с кодом ниже. Я получил большую часть кода от: Convert Rows to columns using 'Pivot' in SQL Server. Это дает мне динамические имена столбцов за эти годы, а затем подсчитывает события за каждый год. Мне нужно (или, по крайней мере, хотелось бы) для имен столбцов, отформатированных как FY 2014 Total и т. Д., А не только 2014. Таким образом, был создан еще один список имен столбцов, которые будут использоваться в качестве выходных имен. Я подумал, что при создании точки вы должны указывать пользовательские имена для новых столбцов. Я не уверен, что мне нужно делать.SQL Pivot Issue, нужны имена динамических столбцов

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

использование @colValues ​​в вашем temp2 cte в обоих местах .. затем используйте это в своем окончательном выборе.

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); 
Смежные вопросы