行转列

一直以为已经写过这个博客的。。。结果没有


1. 首先你要找到你是根据什么分组(group by),也就是通常 第一列会什么呢
 举个例子呢:   ========》
以什么分组呢?肯定是名字的啦!!!

再举个例子:===>
这个又会要已什么分组呢?毫无疑问是RoomTypeCode
这时候你会写出group by 的语句出来,比如上面的两例应该会是这样子:
 select 姓名 from tb group by 姓名
select RoomTypeCode from YearRoomPrice group by RoomTypeCode
这时候我们第一列已经有了

2. 我们需要第二列了(行转列精髓了)
第一个例子中语文,数学,物理其实均是某列中的一个值,一个value值,但是现在要当列了。。。(这里先讲确定几列的情况,之后会说多列的)
select 姓名 from tb group by 姓名
在上面的sql语句上我们要加些东西了,这时候我们想一下为什么group by中一般看其他列都是需要加上sum,max,min等等,因为这个列内容有许多,要分组,只能取一个,但其实select已经取出所有符合条件的了,现只需要将取出的数据处理下即可
 select 姓名,
 max(case when 课程='语文' then 分数 else 0 end) as '语文', --我们这里else的情况都为0,就是因为0是最小的
 max(case when 课程='数学' then 分数 else 0 end) as '数学',
 max(case when 课程='物理' then 分数 else 0 end) as '物理'
 from tb group by 姓名
另一个情况也是这样的
 select max(yrp.HotelID) as HotelID,max(yrp.RoomTypeCode) as RoomTypeCode ,
 max(case BizDate when '2014-11-05' then MarketPrice else 0 end) as '2014-11-05',
 max(case BizDate when '2014-11-06' then MarketPrice else 0 end) as '2014-11-06',
 max(case BizDate when '2014-11-07' then MarketPrice else 0 end) as '2014-11-07',
 max(case BizDate when '2014-11-08' then MarketPrice else 0 end) as '2014-11-08',
 max(case BizDate when '2014-11-09' then MarketPrice else 0 end) as '2014-11-09'
 from YearRoomPrice yrp where HotelID='020046' and BizDate>='2014-11-05' and BizDate<='2014-11-09'
 group by RoomTypeCode
相信大家都能看懂的

3. 其实很多时候大家也不能确定需要分出多少列来,可以适用sql拼接的方式来做
 declare @sql varchar(8000)
 declare @beginDate varchar(100)
 declare @endDate varchar(100)
 declare @hotelID varchar(20)
 set @beginDate='2014-11-05'
 set @endDate='2014-11-09'
 set @hotelID='020046'
 
  set @sql=' select max(yrp.HotelID) as HotelID,max(yrp.RoomTypeCode) as RoomTypeCode '
  select @sql = @sql + ',max(case BizDate when '''+CONVERT(varchar(100),BizDate,23) +''' then MarketPrice else 0 end) as '''+CONVERT(varchar(100),BizDate,23)+''''
  from ( select distinct BizDate from YearRoomPrice where HotelID=@hotelID and BizDate>=@beginDate and BizDate<=@endDate ) as a    --这里红色字的部分可以达到一个循环的作用
  set @sql = @sql+ 'from YearRoomPrice yrp where HotelID=''' +@hotelID+''' and BizDate>=''' +@beginDate+''' and BizDate<=''' +@endDate+'''group by RoomTypeCode'
  print @sql
  exec(@sql)
上面的sql语句print是这样的
 select max(yrp.HotelID) as HotelID,max(yrp.RoomTypeCode) as RoomTypeCode ,
 max(case BizDate when '2014-11-05' then MarketPrice else 0 end) as '2014-11-05',
 max(case BizDate when '2014-11-06' then MarketPrice else 0 end) as '2014-11-06',
 max(case BizDate when '2014-11-07' then MarketPrice else 0 end) as '2014-11-07',
 max(case BizDate when '2014-11-08' then MarketPrice else 0 end) as '2014-11-08',
 max(case BizDate when '2014-11-09' then MarketPrice else 0 end) as '2014-11-09'
 from YearRoomPrice yrp where HotelID='020046' and BizDate>='2014-11-05' and BizDate<='2014-11-09'
 group by RoomTypeCode


好了,大概就是这样了。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值