昨天跑去面试,一个小公司,第一次面试。进去直接笔试,拿着笔动了起来,结果一看题目傻了眼,第一个题目,j简要介绍一下webservice。不知道动笔,然后继续往下看,delegate(委托)的应用,我想说,好吧,我是学的Java,不是.net,虽说.net也学了,但是那是一年前的事情了,那时候学也学的很浅,根本没理解,况且一年没有用过,早扔到九霄云外去了。然后就是数据的问题了,一看,我的拿手好戏,我以为是简单的,谁知道一看就傻了眼,一个表,有姓名,科目,成绩三列,然后六条数据,张三,语文,81,张三,数学,90,张三,英语,90.还有李四的,和张三的数据一样,要转换成姓名,语文,数学,英语这样一个表格。真心不知道做。虽说没做出来,但是那个项目经理人还不错,给我面试机会,然后给我说,要我平时多积累基础知识,和我谈了不少问题。然后,这次面试就say goodbye了。回了学校,我开始动手在网上查那个数据横竖转换的问题,一看,还不少。主要是两种方法。一种是用group by语句,加上case when then,还有一种,就是用pivot这个关键词来完成转换。贴代码,首先是建表
create table T_table (
name varchar(20) not null,
subject varchar(20),
score int
)
insert into T_table values('张三','语文','80')
insert into T_table values('张三','数学','82')
insert into T_table values('张三','英语','78')
insert into T_table values('李四','语文','90')
insert into T_table values('李四','数学','92')
insert into T_table values('李四','英语','98')
查询结果如下:
但是要得到如下结果:
sql语句为:
select name as '姓名', sum(case subject when '语文' then score else '' end) as 语文,
sum(case subject when '数学' then score else '' end) as 数学,
sum(case subject when '英语' then score else '' end) as 英语
from T_table group by name
这是第一种方式,还有另外一种方式:
select name as '姓名' ,语文 ,数学, 英语
from T_table as a pivot (max(score) for subject in(语文,数学,英语)) as b
第二种方式只能用在sqlserver 2005中,2000不支持pivot函数,不过相信应该没有几个人能用sqlserver 2000