行列转换的另一种形式

在实际做项目的时候遇到这样一个问题:数据库表里存储了每个火车站每种类型的火车票销售数量,但是有的火车站可能不销售动车票或者高铁票,最终的结果要如图2所示,不销售类型的火车票就空出来。本文采用master.dbo.spt_values动态生成最大数目的列头,然后采用case when实现每种类型的火车票进行统计。


原始表 dc

图1

期望得到的数据结果

图2

可以采用下面的脚本实现

declare @tsql varchar(6000)
declare @total int 

--取得不同车站拥有的车型最大数量
select @total=  max(c) from (select  count(1) c  from dc group by 站名)t

select @tsql=isnull(@tsql+',','')
            +'max(case when rn='+rtrim(number)+' then 车型 else '''' end) ''车型'','
            +'max(case when rn='+rtrim(number)+' then 数量 else '''' end) ''数量'''
from master.dbo.spt_values
where type='P' and number between 1 and @total

select @tsql='select 站名,'+@tsql
            +' from
               (select 站名,车型,数量,
                       row_number() over(partition by 站名 order by 车型) ''rn''
                from dc) t
               group by 站名'
exec(@tsql)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值