oracle sql 中有没有一种方法可以通过交叉连接获得计数?
Is there a way in oracle sql to get a count with cross join?
我需要一个专业列表和一个字母等级列表,我需要获得与字母等级相关的专业内完成的课程数量。所以如果我有:
Major
Mechanical Engineer
Electrical Engineer
Civil Engineer
Chemical Engineer
...
Grade
A
B
C
...
Student
100 - Alice - Mechanical Engineer
101 - Tom - Mechanical Engineer
102 - Rex - Mechanical Engineer
103 - Bob - Mechanical Engineer
104 - John - Civil Engineer
105 - Alex - Electrical Engineer
Course
001 - Solid Mechanics - 100 - A
002 - Thermodynamics - 100 - A
003 - Heat Transfer - 100 - A
004 - Heat Transfer - 101 - A
005 - Gadgetry - 100 - A
006 - Gadgetry - 101 - A
007 - Gadgetry - 102 - A
008 - Dynamics - 102 - A
009 - Gadgetry - 101 - C
010 - Heat Transfer - 102 - C
011 - Fluid Mechanics - 100 - B
012 - Materials - 102 -B
013 - Intro to EE - 105 - B
014 - Embedded Systems - 105 - B
015 - Analog Circuits - 105 - B
...
我需要输出:
Mechanical Engineer - A - 8
Mechanical Engineer - B - 2
Mechanical Engineer - C - 2
Electrical Engineer - A - 0
Electrical Engineer - B - 3
...
还有一个tablewith students 说每个学生在哪个专业,一门课table哪个学生上了什么课(有的学生可以不上课)以及他们的年级从该课程中收到。
到目前为止我有:
SELECT major_name, grade, COUNT(grade_code) OVER (PARTITION BY major_name)
FROM Major CROSS JOIN ((grade LEFT JOIN course USING (grade_code)) RIGHT JOIN student USING (st_id))
ORDER BY major_name, grade;
但是计数不起作用(每个专业得到相同的错误计数),本质上是课程 table.
中字母等级的总计数
Mechanical Engineer - A - 10
Mechanical Engineer - B - 10
Mechanical Engineer - C - 10
Electrical Engineer - A - 10
...
不需要 CROSS JOIN
或聚合 COUNT...OVER()
window 函数。只需连接主表(student 和 course),然后连接查找表(major 和 年级)。然后,聚合计数。因为 major 链接到不在 FROM
子句中的 student,所以将 USING
替换为传统的 ON
通过相应的别名:
SELECT m.major_name,
g.grade,
count(*) as major_grade_count
FROM course c
LEFT JOIN student s USING (st_id)
LEFT JOIN grade g USING (grade_code)
LEFT JOIN major m ON g.major_code = m.major_code -- ADJUST FIELD HERE
GROUP BY m.major_name,
g.grade;
我需要一个专业列表和一个字母等级列表,我需要获得与字母等级相关的专业内完成的课程数量。所以如果我有:
Major
Mechanical Engineer
Electrical Engineer
Civil Engineer
Chemical Engineer
...
Grade
A
B
C
...
Student
100 - Alice - Mechanical Engineer
101 - Tom - Mechanical Engineer
102 - Rex - Mechanical Engineer
103 - Bob - Mechanical Engineer
104 - John - Civil Engineer
105 - Alex - Electrical Engineer
Course
001 - Solid Mechanics - 100 - A
002 - Thermodynamics - 100 - A
003 - Heat Transfer - 100 - A
004 - Heat Transfer - 101 - A
005 - Gadgetry - 100 - A
006 - Gadgetry - 101 - A
007 - Gadgetry - 102 - A
008 - Dynamics - 102 - A
009 - Gadgetry - 101 - C
010 - Heat Transfer - 102 - C
011 - Fluid Mechanics - 100 - B
012 - Materials - 102 -B
013 - Intro to EE - 105 - B
014 - Embedded Systems - 105 - B
015 - Analog Circuits - 105 - B
...
我需要输出:
Mechanical Engineer - A - 8
Mechanical Engineer - B - 2
Mechanical Engineer - C - 2
Electrical Engineer - A - 0
Electrical Engineer - B - 3
...
还有一个tablewith students 说每个学生在哪个专业,一门课table哪个学生上了什么课(有的学生可以不上课)以及他们的年级从该课程中收到。
到目前为止我有:
SELECT major_name, grade, COUNT(grade_code) OVER (PARTITION BY major_name)
FROM Major CROSS JOIN ((grade LEFT JOIN course USING (grade_code)) RIGHT JOIN student USING (st_id))
ORDER BY major_name, grade;
但是计数不起作用(每个专业得到相同的错误计数),本质上是课程 table.
中字母等级的总计数Mechanical Engineer - A - 10
Mechanical Engineer - B - 10
Mechanical Engineer - C - 10
Electrical Engineer - A - 10
...
不需要 CROSS JOIN
或聚合 COUNT...OVER()
window 函数。只需连接主表(student 和 course),然后连接查找表(major 和 年级)。然后,聚合计数。因为 major 链接到不在 FROM
子句中的 student,所以将 USING
替换为传统的 ON
通过相应的别名:
SELECT m.major_name,
g.grade,
count(*) as major_grade_count
FROM course c
LEFT JOIN student s USING (st_id)
LEFT JOIN grade g USING (grade_code)
LEFT JOIN major m ON g.major_code = m.major_code -- ADJUST FIELD HERE
GROUP BY m.major_name,
g.grade;