【问题标题】:sql server pivot : group by with dynamic columnssql server pivot:使用动态列分组
【发布时间】:2013-09-20 10:40:27
【问题描述】:

我对表格进行了透视,生成了动态列:

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

【问题讨论】:

    标签: sql sql-server group-by pivot dynamic-columns


    【解决方案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

    【讨论】:

    • 我应该想到的好技巧!我保留了max(value) 而不是convert + sum(value)
    • 我误导了你,它仍然适用于max。实际的技巧是从 from 子句中删除 pgroup1pgroup2pgroup3Sum 仅在您有多个具有相同 time, country, disease, variable 的行时才需要
    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多