SQL - Oracle数据库10g按查询分组

时间:2011-10-10 15:01:52

标签: sql oracle

我目前在Oracle数据库10g中使用我的数据库时遇到GROUP BY语句的问题。

我在这个数据库中有四个表 - 广告,员工,StaffGrade和StaffOnAd。我想要查询的是有超过三名工作人员的广告,我想列出该广告标题和付款等级大于2的工作人员数量。

以下是我的尝试:

SELECT Camp.Title 
FROM Campaign Camp
LEFT JOIN WorksOn Wo ON Camp.Title = Wo.Title
LEFT JOIN Staff Stf ON Wo.StaffNo = Stf.StaffNo
LEFT JOIN StaffOnGrade StfOGrde ON Stf.StaffNo = StfOGrde.StaffNo
WHERE StfOGrde.Grade > 2 AND Camp.Title IN (SELECT Camp2.Title FROM Campaign Camp2
LEFT JOIN WorksOn Wo2 ON Camp2.Title = Wo2.Title
WHERE COUNT(Camp2.Title) > 3)
GROUP BY Camp.Title

我收到的错误是:ORA-00934:此处不允许组功能

我四处搜索,基本上这个错误告诉我,我分组的方式是错误的,但我不知道为什么会这样。另外我只是想知道格式化上述代码的正确方法是什么?

感谢任何帮助。

注意:有关下表的更多信息

  • 广告基本上有关于播出日期的字段等。
  • 工作人员已记录其个人详细信息。
  • StaffGrade显示工作人员的付款等级。
  • StaffOnAd显示工作人员在什么广告上工作 广告标题。

编辑1:评论后尝试以下内容:

SELECT Camp.Title 
FROM Campaign Camp
LEFT JOIN WorksOn Wo ON Camp.Title = Wo.Title
LEFT JOIN Staff Stf ON Wo.StaffNo = Stf.StaffNo
LEFT JOIN StaffOnGrade StfOGrde ON Stf.StaffNo = StfOGrde.StaffNo
WHERE StfOGrde.Grade > 2 AND Camp.Title IN (SELECT Camp2.Title FROM Campaign Camp2
LEFT JOIN WorksOn Wo2 ON Camp2.Title = Wo2.Title
HAVING COUNT(Camp2.Title) > 3)
GROUP BY Camp.Title

但是,我收到了一个新错误:ORA-00937:不是单组组功能

编辑2:

SELECT Camp.Title 
FROM Campaign Camp
  LEFT JOIN WorksOn Wo ON Camp.Title = Wo.Title
  LEFT JOIN Staff Stf ON Wo.StaffNo = Stf.StaffNo
  LEFT JOIN StaffOnGrade StfOGrde ON Stf.StaffNo = StfOGrde.StaffNo
WHERE StfOGrde.Grade > 2 
  AND Camp.Title IN 
      ( SELECT Camp2.Title 
        FROM Campaign Camp2
          LEFT JOIN WorksOn Wo2 
            ON Camp2.Title = Wo2.Title
        GROUP BY Camp2.Title
        HAVING COUNT(Camp2.Title) > 3
      )
GROUP BY Camp.Title

此修订查询中没有错误。但是,显示的唯一结果是广告的标题,我还需要工作在该广告上的工作人员的数量,等级支付大于2.我只是假设最后一组声明将解决这个问题,但我不要认为它是必要的。

3 个答案:

答案 0 :(得分:2)

首先......总是,当你在左连接表中选择某个条件时,你将有一个内连接。 根据您的要求:

  • 列出广告标题和支付等级大于2的员工人数
  • 超过3名工作人员的广告

我会做这样的事情:

    SELECT title, SumGradeGreaterThan2
      FROM (SELECT   camp.title, COUNT (*) AS StaffMembers,
                     SUM (CASE
                             WHEN stfogrde.grade > 2
                                THEN 1
                             ELSE 0
                          END) AS SumGradeGreaterThan2
                FROM  Campaign Camp
                LEFT JOIN WorksOn Wo ON Camp.Title = Wo.Title
                LEFT JOIN Staff Stf ON Wo.StaffNo = Stf.StaffNo
                LEFT JOIN StaffOnGrade StfOGrde ON Stf.StaffNo = StfOGrde.StaffNo
            GROUP BY camp.title)
     WHERE StaffMembers > 3

答案 1 :(得分:1)

您不能在where子句中使用聚合函数。改变这个:

WHERE COUNT(Camp2.Title) > 3)

到此:

HAVING COUNT(Camp2.Title) > 3)

答案 2 :(得分:1)

我认为你需要:

SELECT Camp.Title 
FROM Campaign Camp
  LEFT JOIN WorksOn Wo ON Camp.Title = Wo.Title
  LEFT JOIN Staff Stf ON Wo.StaffNo = Stf.StaffNo
  LEFT JOIN StaffOnGrade StfOGrde ON Stf.StaffNo = StfOGrde.StaffNo
WHERE StfOGrde.Grade > 2 
  AND Camp.Title IN 
      ( SELECT Camp2.Title 
        FROM Campaign Camp2
          LEFT JOIN WorksOn Wo2 
            ON Camp2.Title = Wo2.Title
        GROUP BY Camp2.Title              --- the GROUP BY was missing
        HAVING COUNT(Camp2.Title) > 3     --- HAVING, not WHERE
      )
GROUP BY Camp.Title                       --- is this needed? (or was misplaced?)
相关问题