Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
整数范围上的Oracle SQL组_Sql_Oracle11g - Fatal编程技术网

整数范围上的Oracle SQL组

整数范围上的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

使用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         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;