2013-09-20 2 views
0

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

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

select @cols = STUFF((SELECT distinct ',' + 
         QUOTENAME(Replace(variable,char(CAST(0x0016 as int)),'')) val 
         FROM TABLEDATA 
         ORDER BY val asc 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 

SELECT @query = 

'SELECT 
    time, 
    country, 
    disease, 
    ' + @cols + ' 
FROM 
    TABLEDATA 
PIVOT 
(
    MAX(value) 
    FOR variable IN(' + @cols + ')' + 
') AS p; '; 

execute(@query); 

Он возвращает следующий результат:

time | country | disease | indicateur1 | indicateur2 | ... | indicateur14 | ... | indicateurn 
----------------------------------------------------------------------------------------- 
2001 | FRANCE | MAL  | 0.003  |    |  |    |  | 
2002 | FRANCE | AID  |    | 0.45  |  |    |  | 
1997 | ITALY | HIV  | 0.307  |    |  |    |  | 
1999 | ROMANIA | MAL  | 1.044  |    |  |    |  | 
2003 | ROMANIA | AID  |    |    |  | 0.77   |  | 
2003 | ROMANIA | AID  | 0.872  |    |  |    |  | 
2004 | ROMANIA | HIV  |    | 0.921  |  |    |  | 
2002 | IRELAND | MAL  |    | 0.008  |  |    |  | 

Но мне нужно сгруппировать на первых 3-х столбцов, чтобы получить следующее:

time | country | disease | indicateur1 | indicateur2 | ... | indicateur14 | ... | indicateurn 
----------------------------------------------------------------------------------------- 
2001 | FRANCE | MAL  | 0.003  |    |  |    |  | 
2002 | FRANCE | AID  |    | 0.45  |  |    |  | 
1997 | ITALY | HIV  | 0.307  |    |  |    |  | 
1999 | ROMANIA | MAL  | 1.044  |    |  |    |  | 
2003 | ROMANIA | AID  | 0.872  |    |  | 0.77   |  | 
2004 | ROMANIA | HIV  |    | 0.921  |  |    |  | 
2002 | IRELAND | MAL  |    | 0.008  |  |    |  | 

так что мне нужно group by time, country, disease, но как мои столбцы из стержнем являются динамика, я не удается найти решение ...

Вот SQL fiddle

ответ

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

select @cols = STUFF((SELECT distinct ',' + 
         QUOTENAME(Replace(variable,char(CAST(0x0016 as int)),'')) val 
         FROM TABLEDATA 
         ORDER BY val asc 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 

SELECT @query = 

'SELECT 
    time, 
    country, 
    disease, 
    ' + @cols + ' 
FROM (
    Select 
     time, 
     country, 
     disease, 
     variable, 
     convert(decimal(10, 2), value) as value 
    From 
     TABLEDATA 
    ) t 
PIVOT 
(
    Sum(value) 
    FOR variable IN(' + @cols + ')' + 
') AS p; '; 


Execute(@query); 

Example Fiddle

+0

Хороший трюк, который я должен был думать о том! Я сохранил 'max (value)' вместо 'convert' +' sum (value) ' – Yann39

+0

Я неправильно направил вас, он по-прежнему работает с' max'. Фактический трюк заключается в удалении 'pgroup1',' pgroup2', 'pgroup3' из предложения from. «Сумма» необходима только в том случае, если у вас несколько строк с одинаковым «временем, страной, болезнью, переменной» – Laurence