【发布时间】:2015-02-27 22:49:21
【问题描述】:
基表:
date category amount
1/1/2012 ABC 1000.00
2/1/2012 DEF 500.00
2/1/2012 GHI 800.00
2/10/2012 DEF 700.00
3/1/2012 ABC 1100.00
动态 SQL PIVOT:
create table temp
(
date datetime,
category varchar(3),
amount money
)
insert into temp values ('1/1/2012', 'ABC', 1000.00)
insert into temp values ('2/1/2012', 'DEF', 500.00)
insert into temp values ('2/1/2012', 'GHI', 800.00)
insert into temp values ('2/10/2012', 'DEF', 700.00)
insert into temp values ('3/1/2012', 'ABC', 1100.00)
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category)
FROM temp c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT date, ' + @cols + ' from
(
select date
, amount
, category
from temp
) x
pivot
(
max(amount)
for category in (' + @cols + ')
) p '
execute(@query)
drop table temp
结果:
Date ABC DEF GHI
2012-01-01 00:00:00.000 1000.00 NULL NULL
2012-02-01 00:00:00.000 NULL 500.00 800.00
2012-02-10 00:00:00.000 NULL 700.00 NULL
2012-03-01 00:00:00.000 1100.00 NULL NULL
问题:我们如何继续上面的动态 SQL 查询使用 CASE 语句?
我希望结果集中的值显示如下。
示例:对于 ABC 列
当值为 1000.00 THEN 'HIGH'
当值为 500.00 THEN 'MEDIUM'
当值为 null THEN 'LOW'。
DEF 列也是如此
当值为 1000.00 THEN 'HIGH'
当值为 500.00 THEN 'MEDIUM'
当值为 null THEN 'LOW'。
等等..,对于所有列。 此外,如果将新列添加到基表..,则 CASE 语句必须适用于该新列,而无需对查询进行任何更改(我猜可能需要循环条件)。 任何人都可以帮助我如何修改上述查询(或)如何满足此要求。
【问题讨论】:
标签: sql-server tsql pivot dynamic-sql case-statement