例:将选修了 日语 的学生的学号,姓名所有选修科目及科目成绩,以及总成绩列出来.
数据库: 表 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语言实现不了,存储过程吧。
手上没有什么资料,上网查了下,不过只了解了格式,具体在我这儿里怎么应用还是不明白,能在我的程序上改下么?