PostgreSQL:作为学生的人的印刷名称和来自研究生的学生人数不仅仅是该课程的本科生

时间:2018-04-14 11:26:40

标签: sql postgresql

我试图写一个PostgreSQL并且犯了可怕的错误。

我需要打印作为学生的人的姓名,而且研究生的学生人数不仅仅是本科课程的本科生

select p.name from Person p join Course c on (p.course=c.id) join Student s on (c.st_info=s.id) group by p.code,p.name having count(s.type='undergrad') > count(s.type='postgrad');

1 个答案:

答案 0 :(得分:1)

您可以使用以下逻辑来识别课程:

select c.id
from Course c join
     Student s
     on c.st_info = s.id
group by c.id
having sum( (s.type = 'postgrad')::int ) > sum( (s.type = 'undergrad')::int );

我会让你弄清楚如何让那些真正参加课程的学生。

注意:

  • having中的逻辑被颠倒了。这是一个非常基本的错误。
  • count()计算非NULL值的数量。布尔表达式可能总是非NULL,因此它们将返回相同的值。 sum()就是你想要的。
  • 您的数据模型并没有多大意义。为什么course有学生ID?为什么person有课程ID?