2016-08-15 1 views
0

У меня есть таблица с тремя столбцами: Name, Year и Cnt. Я хочу, чтобы сгруппировать все строки по имени и отображать Cnt за каждый год в отдельной колонке На данный момент у меня есть:SQL Server query - конвертировать не агрегированный столбец в столбцы (вместо суммы или подсчета)

SELECT 
    Name, 
    SUM(iif(Year = 2010, Cnt, 0)) [2010], 
    SUM(iif(Year = 2011, Cnt, 0)) [2011], 
    SUM(iif(Year = 2012, Cnt, 0)) [2012], 
    SUM(iif(Year = 2013, Cnt, 0)) [2013], 
    SUM(iif(Year = 2014, Cnt, 0)) [2014], 
    SUM(iif(Year = 2015, Cnt, 0)) [2015], 
    SUM(iif(Year = 2016, Cnt, 0)) [2016] 
FROM cte 
GROUP BY Name 

Но, похоже, крайне уродливое решение. Любые идеи?

+2

Вам нужна 'PIVOT' таблица. – iamdave

+0

К сожалению, у меня нет опыта работы с PIVOT, особенно если мне нужно сгруппировать, если бы вы могли предоставить некоторый код, чтобы помочь - я был бы (почти) вечно благодарен :) –

+0

Это точно. – Hogan

ответ

1

Предполагая, что вы не должен установить список лет, вы будете должны использовать динамический SQL для создания управляемых данных списка столбцов:

create table #temp 
(
    Name nvarchar(10), 
    [Year] int, 
    cnt int 
) 

insert into #temp values ('a',2013,1) 
         ,('b',2013,3) 
         ,('a',2014,5) 
         ,('b',2014,23) 
         ,('a',2015,78) 
         ,('b',2015,6) 
         ,('a',2016,3) 
         ,('b',2016,8) 


DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.[Year]) 
      FROM #temp c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT Name, ' + @cols + ' from 
      (
       select Name 
        , [Year] 
        , cnt 
       from #temp 
      ) x 
      pivot 
      (
       sum(cnt) 
       for [Year] in (' + @cols + ') 
      ) p ' 


execute(@query) 

go 
drop table #temp 
+0

Как и обещал - я сейчас вечно благодарен, и если вы когда-нибудь в Великобритании - позвоните мне, и я куплю вам пиво :) –

Смежные вопросы