2013-03-22 113 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