[英]dynamic pivot issue in sql server 2012
我正在尝试在SQL中实现动态透视以表示下面给出的结果
ID Charge Message Amt Of Billing
4563 WEB FEE 9.75
4563 MONTHLY FEE 6
4563 CLUB FEE 9.95
4648 MONTHLY FEE 6
4648 ACCOUNT FEE 5
4648 CLUB FEE 9.95
4648 WEB FEE 9.75
4650 MONTHLY FEE 6
4650 WEB FEE 9.75
4650 CLUB FEE 9.95
成为这样一个理想的代表。
ID ACCOUNT FEE MONTHLY FEE CLUB FEE WEB FEE
4563 6 9.95 9.75
4648 5 6 9.95 9.75
4650 6 9.95 9.75
非常感谢您的帮助。
对于动态数据透视,您可以使用以下内容:
declare @cols nvarchar(max);
declare @sql nvarchar(max);
select @cols = stuff((
select distinct
', ' + quotename(isnull(nullif(ChargeMessage,''),'unknown'))
from t
order by 1
for xml path (''), type).value('.','nvarchar(max)')
,1,1,'')
select @sql ='
select Id, ' + @cols +'
from (
select Id, ChargeMessage= isnull(nullif(ChargeMessage,''''),''unknown''), AmtOfBilling
from t
) as t
pivot (sum([AmtOfBilling]) for [ChargeMessage] in (' + @cols +')) p'
select @sql
exec(@sql);
rextester演示: http ://rextester.com/NRRGA52425
返回:(包含测试数据的空字符串)
+------+-------------+----------+-------------+---------+---------+
| Id | ACCOUNT FEE | CLUB FEE | MONTHLY FEE | unknown | WEB FEE |
+------+-------------+----------+-------------+---------+---------+
| 4563 | NULL | 9,95 | 6,00 | NULL | 9,75 |
| 4648 | 5,00 | 9,95 | 6,00 | NULL | 9,75 |
| 4650 | NULL | 9,95 | 6,00 | 9,95 | 9,75 |
+------+-------------+----------+-------------+---------+---------+
生成的查询:
select Id, [ACCOUNT FEE], [CLUB FEE], [MONTHLY FEE], [unknown], [WEB FEE]
from (
select Id, ChargeMessage= isnull(nullif(ChargeMessage,''),'unknown'), AmtOfBilling
from t
) as t
pivot (sum([AmtOfBilling]) for [ChargeMessage]
in ( [ACCOUNT FEE], [CLUB FEE], [MONTHLY FEE], [unknown], [WEB FEE])) p
动态条件聚合:
declare @cols nvarchar(max);
declare @sql nvarchar(max);
select @cols = stuff((
select distinct
char(10)+' , '
+ quotename(isnull(nullif(ChargeMessage,''),'unknown'))
+' = sum(case when ChargeMessage = '''+ChargeMessage+''' then AmtOfBilling end)'
from t
order by 1
for xml path (''), type).value('.','nvarchar(max)')
,1,0,'')
select @sql ='
select Id'+@cols+'
from t
group by Id'
select @sql
exec(@sql);
查询生成:
select Id
, [ACCOUNT FEE] = sum(case when ChargeMessage = 'ACCOUNT FEE' then AmtOfBilling end)
, [CLUB FEE] = sum(case when ChargeMessage = 'CLUB FEE' then AmtOfBilling end)
, [MONTHLY FEE] = sum(case when ChargeMessage = 'MONTHLY FEE' then AmtOfBilling end)
, [unknown] = sum(case when ChargeMessage = '' then AmtOfBilling end)
, [WEB FEE] = sum(case when ChargeMessage = 'WEB FEE' then AmtOfBilling end)
from t
group by Id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.