[姓名] [学科] [成绩]
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 数学 92
李四 物理 82
王五 数学 60
变成
[姓名] [语文] [数学] [物理] [总分]
张三 80 90 85 255
李四 85 92 82 259
王五 null 60 null 60
两张表,一个学生信息,一个成绩,
select distinct(姓名) name ,学科 cn from table1 where 学科 ='语文'
作为子集。
然后 insert into table (姓名,语文。。。) ...(子集)
列和列对应
其中子集是从表2查出来的
结果:
一、建表,插基础数据
-- 人员表 create table USERINFO ( id NUMBER not null, username VARCHAR2(100) ) tablespace SYSTEM pctfree 10 pctused 40 initrans 1 maxtrans 255 storage ( initial 64 minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table USERINFO add constraint PK_USER_ID primary key (ID) disable;
-- 学科表 create table SUBJECT ( id NUMBER not null, subjectname VARCHAR2(20), userid NUMBER, score VARCHAR2(20) ) tablespace SYSTEM pctfree 10 pctused 40 initrans 1 maxtrans 255 storage ( initial 64 minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table SUBJECT add constraint PK_SUBJECT primary key (ID) using index tablespace SYSTEM pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited );
--基础数据
insert into userinfo values((select nvl(max(id)+1,100) from userinfo),'张三'); insert into userinfo values((select nvl(max(id)+1,100) from userinfo),'李四'); insert into userinfo values((select nvl(max(id)+1,100) from userinfo),'王五'); insert into subject values((select nvl(max(id)+1,100) from subject),'语文',100,90); insert into subject values((select nvl(max(id)+1,100) from subject),'数学',100,91); insert into subject values((select nvl(max(id)+1,100) from subject),'英语',100,92); insert into subject values((select nvl(max(id)+1,100) from subject),'语文',101,80); insert into subject values((select nvl(max(id)+1,100) from subject),'数学',101,81); insert into subject values((select nvl(max(id)+1,100) from subject),'英语',101,82); insert into subject values((select nvl(max(id)+1,100) from subject),'语文',102,70); insert into subject values((select nvl(max(id)+1,100) from subject),'数学',102,71); insert into subject values((select nvl(max(id)+1,100) from subject),'英语',102,72);
二、查一下
select uo.username as 名字,b.* from userinfo uo ,( select tc.userid, sum(case when tc.subjectname='语文' then tc.score else null end) as 语文, sum(case when tc.subjectname='数学' then tc.score else null end) as 数学, sum(case when tc.subjectname='英语' then tc.score else null end) as 英语 from subject tc group by tc.userid order by tc.userid ) b where b.userid=uo.id
等着,我在用SQLserver给你调试,等下给你标准答案..给我30分钟.
好了,本来应该三个表的..但是你要2个表我也就写2个表..结果如下..经过调试的.
if OBJECT_ID('Score') is not null drop table score create table Score(StudentID int,Subjects nvarchar(10),ScoreNum float) insert Score values(1,N'语文',80) insert Score values(1,N'数学',90) insert Score values(1,N'物理',85) insert Score values(2,N'语文',85) insert Score values(2,N'数学',92) insert Score values(2,N'物理',82) insert Score values(3,N'数学',60) if OBJECT_ID('Student') is not null drop table Student create table Student(ID int identity(1,1),Name nvarchar(10)) insert Student values(N'张三') insert Student values(N'李四') insert Student values(N'王五') select s.Name,tmp.语文,tmp.数学,tmp.物理,tmp.总分 from ( select *,Isnull(pvt.数学,0)+IsNull(pvt.物理,0)+IsNull(pvt.语文,0) 总分 from Score pivot ( sum(ScoreNum) for SubJects in ( 语文,数学,物理) ) as pvt )tmp,Student s where s.ID=tmp.StudentID
这不是列转行吗
sql 2005 可以用 pivot
假设你提供的表为学生表,表列包括姓名、学科、成绩。
查询语句为:
select
s.姓名, yw.成绩 as 语文, sx.成绩 as 数学, wl.成绩 as 物理, zf.成绩 as 总分
from (select 姓名 from 学生 group by 姓名) s
left join (select 姓名, sum(成绩) as 成绩 from 学生 where 学科 = '语文' group by 姓名) yw on s.姓名 = yw.姓名
left join (select 姓名, sum(成绩) as 成绩 from 学生 where 学科 = '数学' group by 姓名) sx on s.姓名 = sx.姓名
left join (select 姓名, sum(成绩) as 成绩 from 学生 where 学科 = '物理' group by 姓名) wl on s.姓名 = wl.姓名
left join (select 姓名, sum(成绩) as 成绩 from 学生 group by 姓名) zf on s.姓名 = zf.姓名
SQL Server 2000 下测试通过。
参照 http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html
2005及以上可用pivot简洁快速实现
其它用sum, group by ,left join