GROUP BY功能问题

时间:2013-03-22 11:09:28

标签: sql oracle

我有以下示例:

SELECT name, age, location, SUM(pay)
FROM employee
GROUP BY location

这正如预期的那样会给我一个错误:

ORA-00979: not a GROUP BY expression

我该如何解决这个问题?我需要按一个列或两列进行分组,但是需要返回所有列,即使它们没有在GROUP BY子句中使用,我已经查看了子查询以解决它但到目前为止没有运气。

3 个答案:

答案 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查询更好,因为你只查询一次表。如果我错了,请纠正我。他还有员工和员工。错字?