2013-03-22 82 views
1

我有下面的例子:GROUP BY功能问题

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

这种预期会给我一个错误:

ORA-00979: not a GROUP BY expression 

我怎样才能解决这个得到什么?我需要组成一个或许两列,但需要返回所有列,即使它们不在GROUP BY子句中使用,我已经查看了子查询以避开它,但目前为止没有运气。

+2

你在这里使用GROUP BY是什么? – 2013-03-22 11:12:18

+1

请提及输入和所需的输出。 – 2013-03-22 11:14:05

+0

对于每个分组的“位置”,您希望从其他列'name,age,pay'返回哪些值?请张贴一些示例数据和期望的输出? – 2013-03-22 11:14:12

回答

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) 

分享和享受。

+0

你好,请阅读我的答案。 – Roger 2013-03-22 12:35:58

2

您可以使用分析功能:

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

所以,你可以返回,即使他们没有在分组中使用的所有行。

+0

+1。 。 。这是更好的方法。 – 2013-03-22 14:27:07

1

(Group 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不知道是否检索A或B的X值,你必须SPECI fy it。即MIN,MAX等。

这个命名的分析函数有一个替代方案,它允许你在结果集的窗口下工作。

现在,如果您希望员工按地点支付总工资,并且每个员工都可能需要这样。

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

我相信这比@Bob Jarvis查询更好,因为您只查询表格一次。如果我错了,请纠正我。他还有员工和员工。错字?

+0

错字。纠正。谢谢。 – 2013-03-22 13:11:10