如何动态使用unpivot?

时间:2016-07-28 09:25:22

标签: sql-server sql-server-2008 sql-server-2008-r2 unpivot

我正在使用MS SQL Server 2008R2,我有一个名为Category的表

Profile   Batch   Doubles  Feeder Image  Hardware
 A          1       1       0      2       1
 B          1       2       3      0       4
 A          1       5       1      6       1
 A          1       2       1      2       7

其中DoublesFeederImageHardware是事件类别。

列名称配置文件,批处理已修复,但稍后可能会添加更多事件类别。 我希望单独使用unpivot和dynamic来汇总所有事件类别。 我的预期输出是,

EventCategory   Occurence
  Doubles         10
  Feeder           5
  Image           10
  Hardware        13

通过更多事件类别可能会在以后添加我的意思是,当添加更多类别时,我需要在unpivot查询中动态添加这些事件类别, 例如预期产出

 EventCategory   Occurence
      Doubles         10
      Feeder           5
      Image           10
      Hardware        13
      Late             6
      Sensor          20
       .               .
       .               .
       .               . --And so on

我还没有尝试过,请建议我动态的unpivot查询。 希望我对这个问题很清楚,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

我认为这就是你所需要的:

CREATE TABLE Category
(
    [Profile] varchar(10),
    Batch int,
    Doubles int,
    Feeder int,
    [Image] int,
    Hardware int
)

INSERT Category VALUES
 ('A', '1', '1', '0', '2', '1'),
 ('B', '1', '2', '3', '0', '4'),
 ('A', '1', '5', '1', '6', '1'),
 ('A', '1', '2', '1', '2', '7')

DECLARE @query nvarchar(MAX);

SELECT @query = COALESCE(
    @query+char(10)+'UNION ALL'+char(10)+'SELECT '+QUOTENAME(name,'''')+' EventCategory, SUM('+QUOTENAME(name)+') Occurence FROM Category',
    'SELECT '+QUOTENAME(name, '''')+' EventCategory, SUM('+QUOTENAME(name)+') Occurence FROM Category')
FROM sys.columns C WHERE [object_id]=OBJECT_ID('Category')
AND name<>'Profile'

EXEC (@query)