ORACLE数据库环境,pl/sql查询环境,怎么用SQL语句实现下面的要求.(回管要完整)

例:将选修了 日语 的学生的学号,姓名所有选修科目及科目成绩,以及总成绩列出来.
数据库: 表 A :学号 选修科目 成绩
1 日语 68
1 高数 78
1 ...... ....
2 英语 89
表 B :学号 姓名 年龄 家庭信址 ......
1 王码 20 汉口
2 李鹏 20 临江
3 ............................
最终要的结果是:学号 姓名 选修科目1 成绩1 ...... 选修科目N 成绩N 总成绩
要用能在PL/SQL下实现的SQL语句~~我小白,怕自己看不懂,浪费了高手的心思.另,一定是选修了日语的条件下的......不是要所有学生的....
以下是我写的程序,可以得出想要学号 姓名 选修科目1 成绩1 ...... 选修科目N 成绩N 总成绩的值,但是1语句太繁琐,2,也是最主要的,出的结果是竖排的就是
学号  姓名  选修科目  成绩  总成绩 
1   王码    日语    68 146
1   王码    高数    78 146
而我需要的结果:
姓名 选修科目1 成绩1 ...... 选修科目N 成绩N 总成绩
王码    日语 68 高数 78 146
大家帮帮忙吧...想得头都痛啦,也没想出来.
select
B.学号,
B.姓名,
A.选修科目,
A.成绩,
s.zcj 总成绩
from A,B,
(select distinct A.学号 from A where A.选修科目='02') z,
( select distinct A.学号,sum(A.成绩) zcj from A group by j.nsrdzdah)s
where and A.学号=B.学号
and z.学号=A.学号(+)
and Z.学号=S.学号(+)
order by B.学号

PS:一楼的语句写的比我的简单多了,但是啊,但是,出的结果成绩的值不对的.另外:和我的一样也是竖排的......
PPS:同样谢谢二楼三楼了,大家一起学习吧

SELECT B.学号,

       B.姓名,

       '日语',

       sum(CASE WHEN A.选修科目 = '日语' THEN A.成绩 ELSE 0 END),

       '高数',

       sum(CASE WHEN A.选修科目 = '高数' THEN A.成绩 ELSE 0 END),

       --......

       '英语',

       sum(CASE WHEN A.选修科目 = '英语' THEN A.成绩 ELSE 0 END),

       SUM(A.成绩)

  FROM A, B

 WHERE A.学号 = B.学号

   AND A.学号 IN (SELECT DISTINCT (学号) FROM A WHERE 选修科目 = '日语')

 GROUP BY B.学号, B.姓名

 ORDER BY B.学号 

符合你描述的么,不符合联系我。 

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

再加一层呗,

select c.c1,c.c2,

case when c.c4<0 then ' ' else c.c3 end,

case when c.c4<0 then ' ' else c.c4 end,

case when c.c6<0 then ' ' else c.c5 end,

case when c.c6<0 then ' ' else c.c6 end,

case when c.c8<0 then ' ' else c.c7 end,

case when c.c8<0 then ' ' else c.c8 end

from

(

SELECT B.学号 c1,

       B.姓名 c2,

       '日语' c3,

       sum(CASE WHEN A.选修科目 = '日语' THEN A.成绩 ELSE -200 END) c4,

       '高数' c5,

       sum(CASE WHEN A.选修科目 = '高数' THEN A.成绩 ELSE -200 END) c6,

       --......

       '英语' c7,

       sum(CASE WHEN A.选修科目 = '英语' THEN A.成绩 ELSE -200 END) c8,

       SUM(A.成绩) c9

  FROM A, B

 WHERE A.学号 = B.学号

   AND A.学号 IN (SELECT DISTINCT (学号) FROM A WHERE 选修科目 = '日语')

 GROUP BY B.学号, B.姓名

)  c

 ORDER BY c.c1

如果你想要数据库中的选修科目不写在语句中,自动的展现成列,DML语言实现不了,存储过程吧。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-03
/*
create table b
(sno int,sname varchar2(20),age int,adder varchar2(30));
insert into b values ( 1 , '王码' , 20 ,'汉口');
insert into b values ( 2 , '李鹏' , 20 ,'临江');
create table a
(sno int,sclass varchar2(20), grade int)
insert into a values ( 1 , '日语', 68);
insert into a values ( 1 , '高数', 78);
insert into a values ( 2 , '英语', 89);
commit;
*/

select b.sname,aa.* from
(select a1.sno, max(case when sclass='日语' then grade end) 日语,
max(case when sclass='英语' then grade end) 英语,
max(case when sclass='高数' then grade end) 高数,
(select sum(grade) from a where sno=a1.sno) total_grade
from a a1 group by a1.sno having max(case when sclass='日语' then grade end) is not null) aa, b
where aa.sno=b.sno
其实就是行列转换,我这里只是举个例子,具体情况还要根据你的课目来添加这个语句
max(case when sclass='高数' then grade end) 高数,----如果你要添加语文课目,把高数改成语文在添加一条就是了本回答被提问者采纳
第2个回答  2011-06-02
解决方法:
select * from
(
select 0 as 排序,A.选修科目,A.成绩,B.学号,B.姓名 from A,B where A.学号=B.学号 and A.学号 in(select 学号 from A where A.科目=日语)
union all
select 1 as 排序,'科目统计' as 科目统计,sum(A.成绩) as 总成绩,B.学号,B.姓名 from A,B where A.学号=B.学号 and A.学号 in(select 学号 from A where A.科目=日语) group by B.学号,B.姓名
)
order by 学号,排序,科目
如果能对你有所帮助请采纳,谢谢!
第3个回答  2011-06-02
select a.学号,b.姓名,a.选修科目,a.成绩,a.总成绩
from
(select a.学号,a.选修科目,a.成绩,sum(a.成绩) as 总成绩 from A where a.选修科目='日语'
group by a.学号,a.选修科目,a.成绩
order by a. 学号)a
left join B on a.学号=b.学号
参考下,新手,不太会写。
第4个回答  2011-06-02
了解下case语句的用法就知道了。追问

手上没有什么资料,上网查了下,不过只了解了格式,具体在我这儿里怎么应用还是不明白,能在我的程序上改下么?

相似回答