首页 新闻 赞助 找找看

怎么将表中的数据当作字段查询出来

0
悬赏园豆:200 [待解决问题]

[姓名]  [学科]  [成绩]
张三    语文    80
张三    数学    90
张三    物理    85
李四    语文    85
李四    数学    92
李四    物理    82
王五    数学    60

变成    
[姓名] [语文] [数学] [物理] [总分]
 张三   80     90     85  255
 李四   85     92     82  259
 王五   null   60     null  60

 

两张表,一个学生信息,一个成绩,

影子落羽的主页 影子落羽 | 初学一级 | 园豆:2
提问于:2013-01-25 23:06
< >
分享
所有回答(8)
0

select distinct(姓名) name ,学科 cn from table1  where 学科 ='语文'
作为子集。

然后 insert into table (姓名,语文。。。)  ...(子集)
列和列对应

其中子集是从表2查出来的

橙&子 | 园豆:202 (菜鸟二级) | 2013-01-25 23:49
0

结果:

一、建表,插基础数据

-- 人员表
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
vancegf | 园豆:234 (菜鸟二级) | 2013-01-26 02:37
1

等着,我在用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


 

 

hexllo | 园豆:318 (菜鸟二级) | 2013-01-26 08:20
0

这不是列转行吗

sql 2005 可以用 pivot

                        
yellowshorts | 园豆:162 (初学一级) | 2013-01-26 11:45
0

假设你提供的表为学生表,表列包括姓名、学科、成绩。

查询语句为:

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 下测试通过。

广阔之海 | 园豆:206 (菜鸟二级) | 2013-01-28 08:57
0

参照 http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html

sym_cn | 园豆:798 (小虾三级) | 2013-01-28 17:05
0

行转列,行基础的东西,看一下我的博客吧,里面说的很详细

http://www.cnblogs.com/li-peng/archive/2012/02/01/2334973.html

li-peng | 园豆:954 (小虾三级) | 2013-01-30 16:49
0

2005及以上可用pivot简洁快速实现 

其它用sum,  group by ,left join 

 

Shannon | 园豆:611 (小虾三级) | 2014-03-04 18:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册