我目前在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:此处不允许组功能
我四处搜索,基本上这个错误告诉我,我分组的方式是错误的,但我不知道为什么会这样。另外我只是想知道格式化上述代码的正确方法是什么?
感谢任何帮助。
注意:有关下表的更多信息
编辑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.我只是假设最后一组声明将解决这个问题,但我不要认为它是必要的。
答案 0 :(得分:2)
首先......总是,当你在左连接表中选择某个条件时,你将有一个内连接。 根据您的要求:
我会做这样的事情:
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?)