我有以下示例:
SELECT name, age, location, SUM(pay)
FROM employee
GROUP BY location
正如预期的那样,这会给我一个错误:
ORA-00979: not a GROUP BY expression
我怎样才能解决这个问题?我需要按一列或两列分组,但需要返回所有列,即使它们没有在 GROUP BY 子句中使用,我已经查看了子查询来解决它,但到目前为止还没有运气。
您可以使用分析函数:
SELECT name
, age
, location
, pay
, SUM(pay) over (partition by location order by location ) total
FROM employee
因此,您可以返回所有行,即使它们未在分组中使用。
因此,您想知道按地点划分的总工资,并且想知道每个地点员工的姓名和年龄?怎么样:
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)
分享和享受。
(Group b[http://docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj32654.html] 必须在每一列中都有一个聚合函数,而不是group by子句。分组时,意味着您希望每组一行。子句中列的不同值出现在最终结果集中。
这是因为 oracle 无法知道要检索的 group by 中没有的列的哪些值。考虑一下:
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,所以您必须指定它。即最小值、最大值等。
这个命名的分析函数有一个替代方法,它允许您在结果集的窗口下工作。
现在,如果您希望按地点支付员工总工资,并且每个员工都可能想要这个。
SELECT name, age, location, SUM(pay) OVER(PARTITION BY location)
FROM employee
我相信这比@Bob Jarvis 查询要好,因为您只查询表一次。如果我错了,请纠正我。他也有雇员和雇员。错字?