分组减去Oracle问题

时间:2012-04-24 18:28:54

标签: sql oracle subquery

我刚创建了这个查询,但是当我将其分组时,我感到困惑,因为我无法将它们视为一个分组。这个查询运行但不是我想要的方式,我想按团队名称对查询进行分组,但是当使用count(*)计算查询并且其计数结果产生相同的数字时,会出现问题,

  SELECT TEAM.NAMATEAM, PERSONAL.KODEPERSON
    FROM TEAM,  PERSONAL
   WHERE TEAM.KODETEAM = PERSONAL.KODETEAM
GROUP BY PERSONAL.KODEPERSON, TEAM.NAMATEAM

MINUS 

  SELECT TEAM.NAMATEAM, PERSONAL.KODEPERSON
    FROM TEAM, PERSONAL, AWARD_PERSON 
   WHERE TEAM.KODETEAM = PERSONAL.KODETEAM 
     AND AWARD_PERSON.PEMENANG = PERSONAL.KODEPERSON
GROUP BY TEAM.NAMATEAM, PERSONAL.KODEPERSON;

我想使用团队名称对所有这些进行分组,但是使用计数会有问题,因为我不知道如何能够按照我想要的顺利运行技术进行分组。谢谢。

1 个答案:

答案 0 :(得分:0)

我理解你的问题吗?您正在尝试创建NAMATEAM,X列表,其中NAMATEAM是团队名称,X是每个团队中没有奖励的人数(在AWARD_PERSON中列出)。如果是这样,您应该能够使用子选择:

SELECT T_NAME, COUNT(*)
FROM (
    SELECT TEAM.NAMATEAM "T_NAME", PERSONAL.KODEPERSON
    FROM TEAM, PERSONAL
    WHERE TEAM.KODETEAM = PERSONAL.KODETEAM
    MINUS
    SELECT TEAM.NAMATEAM "T_NAME", PERSONAL.KODEPERSON
    FROM TEAM, PERSONAL, AWARD_PERSON
    WHERE TEAM.KODETEAM = PERSONAL.KODETEAM 
    AND AWARD_PERSON.PEMENANG = PERSONAL.KODEPERSON )
    -- your original query without the GROUP BYs
GROUP BY T_NAME

第一个子选择SELECT创建一个完整的玩家列表,第二个子选择SELECT创建一个赢得奖励的玩家列表(我假设),MINUS从完整列表中删除获奖者。因此,对于没有奖励的所有玩家,完整的子选择会返回玩家及其团队的列表。

然后主要的SELECT仅对团队名称进行总结,以产生每个团队没有奖励的玩家数量。

您不应该需要原始GROUP BY TEAM.NAMATEAM,PERSONAL.KODEPERSON,除非您的数据库中有重复的行,例如,一个团队中的一个玩家在数据库中有多个行。