我有一个问题,我尝试使用Case语句来更改SQL Server中的Pivot列。
pivot
(
max(col)
for (CASE WHEN @NeedBycolumn = 0 THEN column1 ELSE column2 END) in (' + @cols + ')
) p '
为了说明我的问题,我在这里使用虚拟数据和查询:
https://stackoverflow.com/a/10404455/5686930
所以这是我正在使用的示例数据集和查询
DECLARE @NeedByCategory BIT = 1
create table temp
(
date datetime,
category1 varchar(3),
category2 varchar(3),
amount money
)
insert into temp values ('1/1/2012', 'ABC', 'DEF', 1000.00)
insert into temp values ('2/1/2012', 'DEF', 'ABC', 500.00)
insert into temp values ('2/1/2012', 'GHI', 'GHI', 800.00)
insert into temp values ('2/10/2012', 'DEF', 'ABC', 700.00)
insert into temp values ('3/1/2012', 'ABC', 'DEF', 1100.00)
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME((CASE WHEN @NeedByCategory = 0 THEN category1 ELSE category2 END))
FROM temp c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT date, ' + @cols + ' from
(
select date
, amount
, category1
, category2
from temp
) x
pivot
(
max(amount)
for category2 in (' + @cols + ')
) p '
execute(@query)
drop table temp
在上面的查询中,我使用基于参数值的case语句来更改我传递的列
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME((CASE WHEN @NeedByCategory = 0 THEN category1 ELSE category2 END))
FROM temp c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
所以同时我想在查询的Pivot部分使用case语句动态更改列名,但是它给我一个错误,我无法弄清楚是什么'出错了。
这是代码:
DECLARE @NeedByCategory BIT = 1
create table temp
(
date datetime,
category1 varchar(3),
category2 varchar(3),
amount money
)
insert into temp values ('1/1/2012', 'ABC', 'DEF', 1000.00)
insert into temp values ('2/1/2012', 'DEF', 'ABC', 500.00)
insert into temp values ('2/1/2012', 'GHI', 'GHI', 800.00)
insert into temp values ('2/10/2012', 'DEF', 'ABC', 700.00)
insert into temp values ('3/1/2012', 'ABC', 'DEF', 1100.00)
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME((CASE WHEN @NeedByCategory = 0 THEN category1 ELSE category2 END))
FROM temp c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT date, ' + @cols + ' from
(
select date
, amount
, category1
, category2
from temp
) x
pivot
(
max(amount)
for (CASE WHEN @NeedByCategory = 0 THEN category1 ELSE category2 END) in (' + @cols + ')
) p '
execute(@query)
drop table temp
这是错误:
Msg 102, Level 15, State 1, Line 12
Incorrect syntax near '('.
如果有人可以看一下它,看看它是否可能,那就太好了。如果还有其他办法,请告诉我。
谢谢大家的时间。
答案 0 :(得分:0)
您可能需要修改@Query分配,如下所示:
Select @query = 'SELECT date, ' + @cols + ' from
(
select date
, amount
, category1
, category2
from temp
) x
pivot
(
max(amount)
for ' +CASE WHEN @NeedByCategory = 0 THEN 'category1' ELSE 'category2' END+ ' in (' + @cols + ')
) p '
更改:已更改为选择并将案例移至查询外部