2011-10-10 97 views
1

我目前在Oracle数据库10g中使用我的数据库时遇到了GROUP BY语句问题。SQL - Oracle数据库10g组通过查询

我该数据库中有四个表 - 广告,员工,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显示了工作人员由 标题广告在什么广告作品。

EDIT 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.我只是假设最后一组通过声明可以解决此问题,但我不要认为它是必要的。

回答

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 
+0

我很困惑这一点。我试过了,它返回没有找到数据。什么是gradeok,为什么在案件陈述后?还有总员工,这将是员工表正确吗? – George

+0

在内部select中,您有两个计算列,totalstaff,用于计算与广告相关的总员工记数,以及gradeok(或任何您想称之为唯一的别名),这是案例列的别名并计算有多少员工的付款等级大于2.如果您可以测试它,请尝试仅运行内部选择。 – Aitor

+0

我刚刚编辑了查询以尝试清除列的含义... – Aitor

1

在where子句中不能使用聚合函数。更改此:

WHERE COUNT(Camp2.Title) > 3) 

这样:

HAVING COUNT(Camp2.Title) > 3) 
+0

我读过有关这一点,但我得到一个新的错误 - ORA-00937:不是单组分组函数 – George

+1

@George - 请编辑您发布您的修改后的查询。你会得到一个*语法错误*,除非我们看到你正在运行的实际代码,否则我们无法诊断。 – APC

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

正如我在编辑中提到的,代码工作正常,没有错误,我确实同意最后一组声明是不必要的,但我认为它可能已经解决了广告中工作人员数量不会显示为在表结果列 – George