2014-01-07 35 views
2

我使用oracle的pdf來學習pl/sql。 有一個練習,我必須創建一個新的表格,其中有兩個其他表格已存在的數據 。我認爲這會做的伎倆:Oracle PL/SQL ORA-00937「不是單組功能」

CREATE TABLE new_depts 
AS SELECT d.department_id, d.department_name, sum(e.salary) dept_sal 
FROM employees e, departments d 
WHERE e.department_id = d.department_id; 

但是這引起了以下錯誤:

SQL-Fehler: ORA-00937: not a single-group group function 
00937. 00000 - "not a single-group group function" 

我無法找到關於此錯誤的東西有用。從我所知道的關於SQL的 我的代碼應該可以正常工作!

我錯了嗎?

+0

如果您剛開始學習SQL,那麼您應該停止在'WHERE'子句中使用隱式連接並使用顯式的'JOIN'運算符。您還需要閱讀「GROUP BY」運算符。 –

回答

4

嘗試通過條款加入羣:

CREATE TABLE new_depts 
AS SELECT d.department_id, d.department_name, sum(e.salary) dept_sal 
FROM employees e, departments d 
WHERE e.department_id = d.department_id 
group by d.department_id,d.department_name 

更新1

你需要,因爲你正在使用aggregate function: sum(e.salary)在您選擇查詢的子句中使用組。如果你正在使用聚合函數,那麼你需要有group by子句。有關group by子句的更多信息,請參閱here

+0

這是工作,但爲什麼? :D – user1882812

+0

@ user1882812請參閱update1 – Bhushan

1

理解爲什麼在GROUP BY子句中指定的聚合函數或列無法與選擇列表中的其他非聚合表達式混合使用的主要概念是它們生成的值的詳細程度。 SELECT語句的選擇列表只能包含與該選擇列表中的其他值具有相同詳細級別的值的表達式。

實施例1:不正確

SELECT avg(col1) --> level of detail of the value is aggregated 
     ,col2  --> level of detail of the value is only for one row 
FROM table_a; 

實施例2:正確

SELECT avg(col1) --> level of detail of the value is aggregated 
     ,col2  --> level of detail of the value is aggregated 
FROM table_a 
GROUP BY col2; 

通過包括在該組的列BY子句您聚合指定列和從單排改變其詳細程度骨料。