当前位置:Gxlcms > mysql > 行列转换的另一种形式

行列转换的另一种形式

时间:2021-07-01 10:21:17 帮助过:17人阅读

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

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

原始表 dc

\

图1
<喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+xtrN+7XDtb21xMr9vt294bn7PC9wPgo8cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140326/2014032609093821.jpg" alt="\">

图2

可以采用下面的脚本实现

  1. declare @tsql varchar(6000)
  2. declare @total int
  3. --取得不同车站拥有的车型最大数量
  4. select @total= max(c) from (select count(1) c from dc group by 站名)t
  5. select @tsql=isnull(@tsql+',','')
  6. +'max(case when rn='+rtrim(number)+' then 车型 else '''' end) ''车型'','
  7. +'max(case when rn='+rtrim(number)+' then 数量 else '''' end) ''数量'''
  8. from master.dbo.spt_values
  9. where type='P' and number between 1 and @total
  10. select @tsql='select 站名,'+@tsql
  11. +' from
  12. (select 站名,车型,数量,
  13. row_number() over(partition by 站名 order by 车型) ''rn''
  14. from dc) t
  15. group by 站名'
  16. exec(@tsql)


人气教程排行