为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
【操作系统】:
【CPU】:
【问题描述】*:
学生信息表:
CREATE TABLE "STUDENT"
(
"ST_ID" INT, --学生ID
"ST_NAME" VARCHAR(100), --学生姓名
"ST_ADDR" VARCHAR(100),--学生地址
"ST_DATE" TIMESTAMP(6)) STORAGE(ON "MAIN", CLUSTERBTR) ;
课程信息表
CREATE TABLE "COURSE"
(
"CR_ID" INT, --课程ID
"CR_CLASS" VARCHAR(100), --课程名
"TEACHER" VARCHAR(100)) STORAGE(ON "MAIN", CLUSTERBTR) ; --老师
学时表
CREATE TABLE "CLASS_HOUR"
(
"ST_ID" INT, --学生ID
"CR_ID" INT, --课程ID
"CLASS_HOUR" VARCHAR(100)) STORAGE(ON "MAIN", CLUSTERBTR) ; --学时
显示的结果集:
姓名------地址--------所选课程---------------学时
张三 -----武汉------音乐、美术、数学-------学时相加的结果
SELECT
ST.ST_NAME AS "姓名",
ST.ST_ADDR AS "地址",
WM_CONCAT(C.CR_CLASS) AS "所选课程",
SUM(CH.CLASS_HOUR) AS "学时"
FROM
"STUDENT1" ST
JOIN
"CLASS_HOUR1" CH ON ST.ST_ID = CH.ST_ID
JOIN
"COURSE1" C ON CH.CR_ID = C.CR_ID
GROUP BY
ST.ST_ID, ST.ST_NAME, ST.ST_ADDR;
SELECT
ST.ST_NAME AS "姓名",
ST.ST_ADDR AS "地址",
REPLACE(WM_CONCAT(C.CR_CLASS), ',', '|') AS "所选课程",
SUM(CH.CLASS_HOUR) AS "学时"
FROM
"STUDENT1" ST
JOIN
"CLASS_HOUR1" CH ON ST.ST_ID = CH.ST_ID
JOIN
"COURSE1" C ON CH.CR_ID = C.CR_ID
GROUP BY
ST.ST_ID, ST.ST_NAME, ST.ST_ADDR;
select 姓名,地址,所选课程,学时
from (
select
s.ST_NAME as 姓名,
s.ST_ADDR as 地址,
(select listagg(c.CR_CLASS, ',') within group(order by c.CR_ID)
from COURSE c where r.CR_ID = c.CR_ID
) as 所选课程,
sum(r.CLASS_HOUR) over(partition by s.ST_ID) as 学时,
row_number() over(PARTITION BY s.ST_ID order by null) sn
from STUDENT s, CLASS_HOUR r
where s.ST_ID = r.ST_ID(+)
) where sn = 1 ;
这个题,目测有坑啊。。。
一、未确认各表主键,那就自然会引出如果存在重复记录应该如何处理这个问题
尤其是,当 CLASS_HOUR 表中同一学生ID,同一课程ID时,是取最大学时值还是取学时值合计值?
二、在查下结果集要求中,能看出是以学生为主信息,那当某个学生没有学时记录时,这个学生的信息是否列出?
[手动旺柴]
请问出现了什么问题?