繁体   English   中英

sql server 2012中的动态数据库问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM