整数范围上的Oracle SQL组
使用oracle11g 我有一张表格,里面有学生ID和分数的列表。另一个查找表保存每个坡率的边界值整数范围上的Oracle SQL组,sql,oracle11g,Sql,Oracle11g,使用oracle11g 我有一张表格,里面有学生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
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个“等级”边界。因此,下面的代码变得相当笨拙。理想情况下,我正在寻找一种方法,使用一种内置的方法,按照团队的思路,产生相同的结果
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);
嗯?只需执行一个join和
分组操作
:
SELECT gl.GRADE, COUNT(*) AS STUDENT_COUNT
FROM STUDENT_MARKS sm JOIN
GRADE_LOOKUP gl
ON sm.student_mark BETWEEN gl.LOWER_MAKR and gl.UPPER_MARK
GROUP BY gl.GRAdE
ORDER BY gl.GRADE;
SELECT gl.GRADE, COUNT(*) AS STUDENT_COUNT
FROM STUDENT_MARKS sm JOIN
GRADE_LOOKUP gl
ON sm.student_mark BETWEEN gl.LOWER_MAKR and gl.UPPER_MARK
GROUP BY gl.GRAdE
ORDER BY gl.GRADE;