竖表转横表

来源:互联网 发布:js cookie设置 编辑:程序博客网 时间:2024/05/18 00:48

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

任务大体要求如下:

 

 

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

教师号  星期号 是否有课
 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

原创粉丝点击