【问题标题】:SQL - Oracle Database 10g Group By QueriesSQL - Oracle Database 10g 按查询分组
【发布时间】:2011-10-10 15:01:51
【问题描述】:

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

我在这个数据库中有四个表——Advertising、Staff、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: group function is not allowed here

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

感谢任何帮助。

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

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

编辑 1:在 cmets 之后尝试了以下操作:

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: not a single-group group function

编辑 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。我只是假设最后一个 group by 语句可以解决这个问题,但我觉得没必要。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

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

    • 包含广告标题和支付等级高于 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
    

    【讨论】:

    • 我对此感到困惑。我试过了,它返回没有找到数据。什么是gradeok,为什么在case语句之后?同样对于 totalstaff,Staff 表是否正确?
    • 在内部选择中,您有两个计算列,totalstaff,用于计算与广告相关的员工总数,以及gradeok(或任何您想称呼它的名称,它只是一个别名),它是 case 列的别名,计算有多少员工的支付等级大于 2。如果可以测试,只尝试运行内部选择。
    • 好的,我已经测试过了。第一个测试是整个语句并且显示没有找到数据。但是,根据您的建议,我测试了内部选择,我认为我们已经接近了。它显示所有广告标题、每个广告的工作人员数量和另一列 (sumgradegreaterthan2) 显示 0 或 1,表示有多少工作人员的等级 > 2。据此,我将如何列出超过 3 个工作人员的广告标题并且只计算那些等级> 2的员工
    • 对不起..你能告诉我你在内部选择执行中列员工的最大值吗?我的意思是.. 外部选择仅用作过滤器,过滤员工值大于 3 的行...我不明白为什么,在整个声明中,您没有找到数据。
    • 是的,我想我可能在填充数据方面发现了一些错误。在工作人员列下,每个广告仅显示 1 名工作人员,但 1 个有两名工作人员的广告除外。但是,我正在查看我的数据,其中大多数人至少有 2-3 名员工。我不知道出了什么问题。
    【解决方案2】:

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

    WHERE COUNT(Camp2.Title) > 3)
    

    对此:

    HAVING COUNT(Camp2.Title) > 3)
    

    【讨论】:

    • 我已经读过这个但是我得到一个新的错误 - ORA-00937: not a single-group group function
    • @George - 请使用修改后的查询编辑您的帖子。您收到 语法错误,除非我们看到您正在运行的实际代码,否则我们将无法诊断。
    【解决方案3】:

    我认为你需要:

    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?)
    

    【讨论】:

    • 正如我在编辑中提到的,代码运行良好,没有错误,我同意最后一个 group by 语句不是必需的,但我认为它可能解决了工作人员数量的问题处理未在表格结果中显示为列的广告
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2011-03-11
    • 2013-10-31
    • 2011-09-08
    • 2011-07-14
    相关资源
    最近更新 更多