首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL - Oracle数据库10g按查询分组

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

Stack Overflow用户
提问于 2011-10-10 15:01:51
回答 3查看 1.3K关注 0票数 1

目前,我在Oracle数据库10g中的GROUP语句与我的数据库有问题。

我在这个数据库中有四个表--广告、员工、StaffGrade和StaffOnAd。我想问的是,对于有三名以上工作人员的广告,我想列出广告标题和支付等级超过2的工作人员的数量。

以下是我的尝试:

代码语言:javascript
复制
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函数在这里是不允许的。

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

任何帮助都是非常感谢的。

注意:只是关于下面的表格的更多信息

  • Advertisements基本上有关于航空、日期等的字段。
  • 的工作人员有他们的个人详细信息,recorded.
  • StaffGrade显示工作人员的支付等级是什么。
  • StaffOnAd通过广告标题显示工作人员在做什么广告。

编辑1:在注释之后尝试以下操作:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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。我只是假设最后一组陈述会解决这个问题,但我不认为有必要。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-10 15:46:28

首先..。通常,当您在左侧join表中放入select条件时,就会有一个内部联接。根据您的要求:

2

  • Advertisements的
  • 列表中有广告标题和有薪酬等级的工作人员人数,超过3名工作人员

我会这样做:

代码语言:javascript
复制
    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
票数 2
EN

Stack Overflow用户

发布于 2011-10-10 15:03:55

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

代码语言:javascript
复制
WHERE COUNT(Camp2.Title) > 3)

对此:

代码语言:javascript
复制
HAVING COUNT(Camp2.Title) > 3)
票数 1
EN

Stack Overflow用户

发布于 2011-10-10 15:19:18

我觉得你需要:

代码语言:javascript
复制
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?)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7714744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档