2011-05-01 107 views
1

我一直在查询中遇到一些困难。我有两个表(略不相关的数据):需要关于SQL查询的帮助

学生(SID,职业),其中的职业生涯或者是 “ugrd” 或 “GRD”,
的memberOf(studentid,组名)

SELECT "GROUPNAME" FROM "MEMBEROF" 
INNER JOIN "STUDENT"  //to get rid of students not in a group 
ON "SID" = "STUDENTID" 
GROUP BY "GROUPNAME"  //so that no duplicates are listed 

这是我迄今为止工作的代码,但它只列出了其中有学生的组。我需要一个能够列出比“UGRD”更多的“GRD”学生的团体的查询,但是我不确定如何去比较每个团队中的本科生的数量和毕业生的数量,并选择更多的毕业生。

到目前为止,我已经尝试使用计数函数,但一直无法找出一种方法来处理它的方式,可以回答问题。我真的很想了解如何获得我需要的结果以及它的工作原理。如果有人能帮忙,我会很感激。谢谢。

回答

2

这应该给你没有学生的团体,以及毕业生和本科生的人数。 (我把内部改为了左连接)。总和想法来自Matthew Jones,所以如果这对你也有帮助,请给他加票。然后,您可以在Grads和UGrads栏上做一个条款。

SELECT "GROUPNAME", 
SUM(CASE WHEN career= 'grd' THEN 1 ELSE 0 END) AS 'Grads', 
SUM(CASE WHEN career = 'ugrd' THEN 1 ELSE 0 END) AS 'UGrads' 
FROM "MEMBEROF" 
LEFT JOIN "STUDENT"  //to get rid of students not in a group, but keep groups with no students 
ON "SID" = "STUDENTID" 
GROUP BY "GROUPNAME"  //so that no duplicates are listed 
HAVING Grads > UGrads 

编辑:修改基于评论。

+1

您不能使用'WHERE'条款履行GRD/UGRD过滤器的要求,因为你不直到分组后才知道聚合值,但是可以使用'HAVING'子句:'HAVING SUM(CASE WHEN CAREER ='GRD'THEN 1 ELSE 0 END)> SUM(CASE WHEN CAREER ='UGRD'THEN 1 ELSE 0 END)'。 (我会失去所有的双引号,但是如果它们包含在内,那么列名和表名必须与定义匹配;而列值周围的双引号应该是单引号)。 – 2011-05-01 22:11:22

+0

你应该提到,最后可以添加'HAVING Grads> UGrads'子句(而不是'WHERE')。 – 2011-05-01 22:47:06

+0

@亚历山大我知道在我输入时引用感觉不对,谢谢。剩下的问题是如何解决的。固定提及要去哪里。谢谢,它已经使用了一段时间了。 – 2011-05-02 02:01:13

0

的HAVING条件可以写成:

HAVING SUM(CASE WHEN CAREER = 'GRD' THEN 1 ELSE 0 END) 
    > SUM(CASE WHEN CAREER = 'UGRD' THEN 1 ELSE 0 END) 

或像这样:

HAVING SUM(CASE WHEN CAREER = 'GRD' 
        THEN 1 
       WHEN CAREER = 'UGRD' 
        THEN -1 
       ELSE 0 END) 
     > 0