竖表转横表

今天遇到一个要求将竖表转换成横表。以前看过竖表转横表但没写过,现记录下来以供学习。

任务大体要求如下:

 

 

========================

教师号  星期号 是否有课
 1    2   有
 1    3   有
 2    1   有
 3    2   有
 1    2   有
写一条sql语句让你变为这样的表
教师号 星期一 星期二 星期三
 1       2   1 
 2   1   
 3       1
-------------------------------------------

 

建表:

create table teac_info(
teac_no number,
day_no number,
arrg_mode varchar2(5))

 

添加数据:

insert into teac_info values(1,2,'有');
insert into teac_info values(1,3,'有');
insert into teac_info values(2,1,'有');
insert into teac_info values(3,2,'有');
insert into teac_info values(1,2,'有');

 

开始写的时候只写了在oracle平台上的sql语句,在写好后在网上搜索到一些在ms sql平台的语句。做了一个整理,先将两个平台的都写出来供参考:

 

(1)、oracle 10g,在此平台上用的是oracle的decode函数(在此平台上的语句执行通过):

 

select teac_no as 教师编号

,sum(decode(day_no,1,1)) as 星期一
,sum(decode(day_no,2,1)) as 星期二
,sum(decode(day_no,3,1)) as 星期三
from teac_info
where arrg_mode ='有'
group by teac_no

 

输出如下:

 

  教师编号     星期一     星期二     星期三
---------- ---------- ---------- ----------
         1                     2          1
         2          1           
         3                     1

 

(2)、ms sql平台上的语句(此语句是根据网上一位同志的参考写的,没有执行)

 

select teac_no as 教师编号,
sum(case day_no when 1 then 1 end ) 星期一,
sum(case day_no when 2 then 1 end ) 星期二,
sum(case day_no when 3 then 1 end ) 星期三,
from teac_info
where arrg_mode ='有'
group by teac_no

 

 

对ms sql平台的这条语句不很熟悉,为了方便对ms sql平台语句的理解,我将原来的语句粘贴下来:

(以下资料来自:http://blog.sina.com.cn/s/blog_567a8f380100cr2g.html

测试数据:

CREATE TABLE test (name char(10),subject char(10),score int)
go
insert test values( '张三 ', '语文 ',80)
insert test values( '张三 ', '数学 ',86)
insert test values( '张三 ', '英语 ',75)
insert test values( '李四 ', '语文 ',78)
insert test values( '李四 ', '数学 ',85)
insert test values( '李四 ', '英语 ',78)

 

--想变成以下效果
--
-- 姓名 语文 数学 英语
-- 张三 80 86 75
-- 李四 78 85 78

 

select name,
sum(case t.subject when '语文' then t.score else 0 end ) 语文,
sum(case t.subject when '数学' then t.score else 0 end ) 数学,
sum(case t.subject when '英语' then t.score else 0 end ) 英语
from test t
group by t.name

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值