0

可能重复:
SQL Server 动态 PIVOT 查询?

我有以下结构的临时表:

MONTH  ID           CNT
-----  -----------  ---
4      TOTAL_COUNT  214
5      TOTAL_COUNT  23
6      TOTAL_COUNT  23
4      FUNC_COUNT   47
5      FUNC_COUNT   5
6      FUNC_COUNT   5
4      INDIL_COUNT  167
5      INDIL_COUNT  18
6      INDIL_COUNT  18

我如何在此表中获得一个月的 Pivot,例如:

ID           APRIL  MAY  JUNE 
-----------  -----  ---  ----
TOTAL_COUNT  214    23   23
FUNC_COUNT   47     5    5
INDIL_COUNT  167    18   18

请考虑这种表格格式。我在发布这种格式时有点乱。

4

2 回答 2

2

我会将月份整数到月份名称的转换留给您,但这将为您执行 PIVOT。

declare @t table
( [month] int, [id] nvarchar(20), [cnt] int )

insert @t values (4,'TOTAL_COUNT',214)
insert @t values (5,'TOTAL_COUNT',23)
insert @t values (6,'TOTAL_COUNT',23)
insert @t values (4,'FUNC_COUNT',47)
insert @t values (5,'FUNC_COUNT',5)
insert @t values (6,'FUNC_COUNT',5)
insert @t values (4,'INDIL_COUNT',167)
insert @t values (5,'INDIL_COUNT',18)
insert @t values (6,'INDIL_COUNT',18)

SELECT 
    [id], [4], [5], [6]
FROM
    (SELECT [month], [id], [cnt] FROM @t) src
PIVOT
    (SUM([cnt]) FOR [month] IN ([4], [5], [6])) p
于 2012-05-29T04:41:21.180 回答
1

虽然您可以使用静态枢轴- 一个您对月份进行硬编码的枢轴。在评论中,您说月数可能是未知的,如果是这种情况,那么您将需要使用动态枢轴来生成月份列表。使用 Dynamic Pivot 使您可以灵活地在运行它之前不知道所需的列。

create table t
( 
    [month] int, 
    [id] nvarchar(20), 
    [cnt] int 
)

insert t values (4,'TOTAL_COUNT',214)
insert t values (5,'TOTAL_COUNT',23)
insert t values (6,'TOTAL_COUNT',23)
insert t values (4,'FUNC_COUNT',47)
insert t values (5,'FUNC_COUNT',5)
insert t values (6,'FUNC_COUNT',5)
insert t values (4,'INDIL_COUNT',167)
insert t values (5,'INDIL_COUNT',18)
insert t values (6,'INDIL_COUNT',18)

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(month) 
            FROM t 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, ' + @cols + ' from 
            (
                select month, id, cnt
                from t
           ) x
            pivot 
            (
                 sum(cnt)
                for month in (' + @cols + ')
            ) p '


execute(@query)

drop table t

结果将是:

在此处输入图像描述

于 2012-05-29T15:14:43.670 回答