今天在csdn上遇到一个问题,是关于sql数据行列转换的,我的写法如下:

可以有两种写法,一种可以写的很灵活,另一种则写死,如下表结构:
car_name  date_time            state
汽车A 2001-01-01 01:01:01.000 出发
汽车A 2002-08-01 01:01:00.000 返回
汽车B 2001-03-01 01:01:00.000 出发
汽车B 2001-05-01 01:01:00.000 返回
汽车C 2001-06-01 01:00:00.000 出发
汽车D 2001-06-01 01:00:00.000 出发
汽车C 2001-08-01 01:00:00.000 返回


第一种写法:,很灵活,你可以有多种state

SQL code
   
   
注:在这里(select state from car group by state)这是必须的,说明你的想要得到的结果列(结果种类),刚开使我也犯了错误,把表名
   
   
直接写上了,得到我多个重复的列; declare @m_sql varchar(8000) set @m_sql='select car_name ' select @m_sql=@m_sql+', max(case state when '''+a.state+''' then convert(varchar(10),date_time) else ''0'' end ) as ['+a.state+']' from (select state from car group by state) as a set @m_sql=@m_sql+' from car group by car_name' exec(@m_sql)


第二种写法:这就比较死板了,是固定的,但是很简单:
如下

SQL code
   
   
select car_name , max ( case state when ' 出发 ' then convert ( varchar ( 10 ),date_time) else ' 0 ' end ) as [ 出发 ] , max ( case state when ' 返回 ' then convert ( varchar ( 10 ),date_time) else ' 0 ' end ) as [ 返回 ] from car group by car_name
 
 
得到结果如下:
结果是一样的:
car_name  出发            返回
汽车A 01  1 2001 08  1 2002
汽车B 03  1 2001 05  1 2001
汽车C 06  1 2001 08  1 2001
汽车D 06  1 2001 0
csdn原贴:http://topic.csdn.net/u/20090414/22/f5c80b09-6263-482e-a2a4-471ebc3126a7.html?seed=1730328476
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值