我有以下结构的临时表:
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
请考虑此表格格式。发布这种格式我有点乱。
答案 0 :(得分: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
答案 1 :(得分: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
结果将是: