【发布时间】:2017-09-26 04:51:19
【问题描述】:
使用 Oracle 11g。
我有一个表格,其中包含学生 ID 和分数的列表。另一个查找表保存每个等级的边界值。
STUDENT_MARKS:
STUDENT_ID STUDENT_MARK
1 20
2 60
3 90
4 20
GRADE_LOOKUP:
GRADE_ID GRADE LOWER_MARK UPPER_MARK
1 A 80 100
2 B 50 79
3 C 0 49
我正在尝试编写查询以返回每个年级边界内的学生人数。例如:
STUDENT_GRADE STUDENT_COUNT
A 1
B 1
C 2
我编写了以下代码,它返回正确的结果,但实际数据包含大约 40 个“等级”边界。因此,下面的代码变得相当笨拙。理想情况下,我正在寻找一种使用内置方法产生相同结果的方法,类似于 GROUP。
SELECT 'A' AS STUDENT_GRADE,
COUNT(STUDENT_ID) AS STUDENT_COUNT
FROM STUDENT_MARKS
WHERE STUDENT_MARK >= (SELECT LOWER_MARK FROM GRADE_LOOKUP WHERE GRADE_ID
= 1)
UNION ALL
SELECT 'B' AS STUDENT_GRADE,
COUNT(STUDENT_ID) AS STUDENT_COUNT
FROM STUDENT_MARKS
WHERE STUDENT_MARK >= (SELECT LOWER_MARK FROM GRADE_LOOKUP WHERE GRADE_ID
= 2)
AND STUDENT_MARK <= (SELECT UPPER_MARK FROM GRADE_LOOKUP WHERE GRADE_ID
=2)
UNION ALL
SELECT 'C' AS STUDENT_GRADE,
COUNT(STUDENT_ID) AS STUDENT_COUNT
FROM STUDENT_MARKS
WHERE STUDENT_MARK <= (SELECT UPPER_MARK FROM GRADE_LOOKUP WHERE GRADE_ID
= 3);
设置代码如下。感谢您的帮助。
CREATE TABLE STUDENT_MARKS
(
STUDENT_ID INTEGER PRIMARY KEY,
STUDENT_MARK INTEGER
);
INSERT ALL
INTO STUDENT_MARKS (STUDENT_ID, STUDENT_MARK) VALUES (1, 20)
INTO STUDENT_MARKS (STUDENT_ID, STUDENT_MARK) VALUES (2, 60)
INTO STUDENT_MARKS (STUDENT_ID, STUDENT_MARK) VALUES (3, 90)
INTO STUDENT_MARKS (STUDENT_ID, STUDENT_MARK) VALUES (4, 20)
SELECT * FROM DUAL;
CREATE TABLE GRADE_LOOKUP
(
GRADE_ID INTEGER PRIMARY KEY,
GRADE VARCHAR2(10),
LOWER_MARK INTEGER,
UPPER_MARK INTEGER
);
INSERT ALL
INTO GRADE_LOOKUP (GRADE_ID, GRADE, LOWER_MARK, UPPER_MARK) VALUES
(1, 'A', 80, 100)
INTO GRADE_LOOKUP (GRADE_ID, GRADE, LOWER_MARK, UPPER_MARK) VALUES
(2, 'B', 50, 79)
INTO GRADE_LOOKUP (GRADE_ID, GRADE, LOWER_MARK, UPPER_MARK) VALUES
(3, 'C', 0, 49)
SELECT * FROM DUAL;
【问题讨论】: