我有下表,里面有一些记录。
示例:
表:ffortest
create table ffortest
(
col1 int,
col2 int
)
插入记录:
insert into ffortest values(1,2);
insert into ffortest values(3,4);
insert into ffortest values(5,6);
insert into ffortest values(7,8);
insert into ffortest values(9,2);
insert into ffortest values(1,2);
数据透视表查询:
DECLARE @StuffColumn varchar(max)
DECLARE @sql varchar(max)
SELECT @StuffColumn = STUFF((SELECT ','+QUOTENAME(col1)
FROM ffortest
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
PRINT(@StuffColumn)
SET @SQL = ' select col2,'+ @StuffColumn +'
from
(
select col1,col2
from ffortest
)x
pivot
(
count(col1)
for col1 in( '+@StuffColumn +')
)p'
PRINT(@SQL)
EXEC(@SQL)
错误:列' 1'在p。
中指定了多个时间预期结果:
col2 1 9 3 5 7
-------------------
2 2 1 0 0 0
4 0 0 1 0 0
6 0 0 0 1 0
8 0 0 0 0 1
答案 0 :(得分:1)
生成列列表时使用distinct
来避免此错误。因为您不能在Pivot中多次使用相同的列,如
pivot
(
count(col1)
for col1 in ([1],[3],[5],[7],[9],[1])
)p'
所以改变你的 @StuffColumn 。
SELECT @StuffColumn = STUFF((SELECT distinct ','+QUOTENAME(col1)
FROM ffortest
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')