我有以下示例:
SELECT name, age, location, SUM(pay)
FROM employee
GROUP BY location
这正如预期的那样会给我一个错误:
ORA-00979: not a GROUP BY expression
我该如何解决这个问题?我需要按一个列或两列进行分组,但是需要返回所有列,即使它们没有在GROUP BY子句中使用,我已经查看了子查询以解决它但到目前为止没有运气。
答案 0 :(得分:2)
您可以使用分析函数:
SELECT name
, age
, location
, pay
, SUM(pay) over (partition by location order by location ) total
FROM employee
因此,即使它们未在分组中使用,您也可以返回所有行。
答案 1 :(得分:1)
因此,您想知道按地点划分的总薪酬,并且您想知道每个地点的员工姓名和年龄?怎么样:
SELECT e.NAME,
e.AGE,
e.LOCATION,
t.TOTAL_LOCATION_PAY
FROM EMPLOYEE e
INNER JOIN (SELECT LOCATION,
SUM(PAY) AS TOTAL_LOCATION_PAY
FROM EMPLOYEE
GROUP BY LOCATION) t
ON (t.LOCATION = e.LOCATION)
分享并享受。
答案 2 :(得分:1)
(B组[http://docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj32654.html]必须在不在group by子句中的每一列中都有一个聚合函数。当您进行分组时,表示每个组需要一行。子句中列的不同值显示在最终结果集中。
这是因为oracle无法知道组中没有哪个列的值来检索。考虑一下:
A X
B X
Select col1, col2 from myTable group by col2; -- incorrect
Select min(col1), col2 from myTable group by col2; -- correct
为什么第一个不正确?因为oracle无法知道是否要为X值检索A或B,所以必须指定它。即MIN,MAX等
这个命名的分析函数有一个替代方法,允许您在结果集的窗口下工作。
现在,如果您希望按地点分配员工总薪资,并且您希望每个员工都愿意这样做。
SELECT name, age, location, SUM(pay) OVER(PARTITION BY location)
FROM employee
我相信这比@Bob Jarvis查询更好,因为你只查询一次表。如果我错了,请纠正我。他还有员工和员工。错字?