行列转换的另一种形式

来源:互联网 发布:云计算ppt模板免费 编辑:程序博客网 时间:2024/06/08 09:25

在实际做项目的时候遇到这样一个问题:数据库表里存储了每个火车站每种类型的火车票销售数量,但是有的火车站可能不销售动车票或者高铁票,最终的结果要如图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 站名)tselect @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_valueswhere type='P' and number between 1 and @totalselect @tsql='select 站名,'+@tsql            +' from               (select 站名,车型,数量,                       row_number() over(partition by 站名 order by 车型) ''rn''                from dc) t               group by 站名'exec(@tsql)


0 0
原创粉丝点击