【问题标题】:Is there a way in oracle sql to get a count with cross join?oracle sql中有没有办法通过交叉连接获得计数?
【发布时间】:2020-03-23 04:53:22
【问题描述】:

我需要获取专业列表和字母等级列表,并且我需要获取与字母等级相关的专业内完成的课程数量。所以如果我有:

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
...

还有一张学生表,上面写着每个学生的专业,还有一张课程表,学生用什么课程(有些学生可以不参加任何课程)以及他们从该课程获得的成绩。

到目前为止我有:

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;

但是计数不起作用(每个专业得到相同的错误计数),基本上是课程表中字母等级的总计数。

Mechanical Engineer - A - 10
Mechanical Engineer - B - 10
Mechanical Engineer - C - 10
Electrical Engineer - A - 10
...

【问题讨论】:

  • 有匹配的样本表数据和预期结果。 (我们还能如何验证计数?)
  • 我临时编造了一些样本数据,希望这很有意义

标签: sql count cross-join


【解决方案1】:

不需要CROSS JOIN 或聚合COUNT...OVER() 窗口函数。只需加入主表(studentcourse),然后加入查找表(majorgrade)。然后,聚合计数。因为major链接到不在FROM子句中的student,所以用相应的别名替换传统的ONUSING

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2012-04-16
    • 2019-10-29
    • 2012-09-17
    • 2015-01-15
    相关资源
    最近更新 更多