使用Case Statement更改PIVOT列

时间:2017-06-02 19:55:21

标签: sql-server

我有一个问题,我尝试使用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 '('.

如果有人可以看一下它,看看它是否可能,那就太好了。如果还有其他办法,请告诉我。

谢谢大家的时间。

1 个答案:

答案 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 '

更改:已更改为选择并将案例移至查询外部