1

我有以下示例:

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

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

ORA-00979: not a GROUP BY expression

我怎样才能解决这个问题?我需要按一列或两列分组,但需要返回所有列,即使它们没有在 GROUP BY 子句中使用,我已经查看了子查询来解决它,但到目前为止还没有运气。

4

3 回答 3

2

您可以使用分析函数:

SELECT name
, age
, location
, pay
, SUM(pay) over (partition by location order by location ) total
    FROM employee

因此,您可以返回所有行,即使它们未在分组中使用。

于 2013-03-22T12:24:26.650 回答
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)

分享和享受。

于 2013-03-22T12:08:25.867 回答
1

(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 查询要好,因为您只查询表一次。如果我错了,请纠正我。他也有雇员和雇员。错字?

于 2013-03-22T12:32:48.213 回答