2017-06-22 45 views
-1
 DECLARE 

    v_department_name VARCHAR(50); 
    v_department_manager VARCHAR(50); 
    v_totalsalary NUMBER(5); 

    BEGIN 

    SELECT departments.department_name, concat(employees.first_name, employees.last_name), sum(employees.salary) 
    INTO v_department_name, v_department_manager, v_totalsalary 
    FROM employees LEFT JOIN departments ON employees.department_id =departments.department_id WHERE departments.department_id = 100; 

    DBMS_OUTPUT.PUT_LINE ('Department Name is: ' || v_department_name || 'And Department Manager is: ' || v_department_manager || 'Total Amount of Salary is: ' || v_totalsalary); 

    END; 

当试图以显示部门名称,部门经理(名字,姓氏),并通过 员工的部门ID 100赚工资的总量,我得到这个:加入SQL查询提供了ORA-00937错误

ORA-00937:不是单组分组函数

是什么原因造成的错误?

表的员工(雇员标识,名字,姓氏,部门标识,经理标识,薪水)

表部门(部门标识,部门名称,经理标识,LOCATION_ID)

+3

不要让我们陷入悬念!什么是错误!? –

+0

ORA-00937错误:不是单组功能 – kago

+0

其他人发布了另一个关于同一作业分配的问题(在代码中有不同的错误)。我解释了如何解决这个问题。 https://stackoverflow.com/questions/44709714/pl-sql-sql-statement-ignored-and-missing-right-parenthesis/44709768?noredirect=1#comment76404070_44709768 – mathguy

回答

0

ORA-00937:简单的说,你需要GROUP BY条款,并在该条款重复SELECT子句中的每一列,不使用聚合函数,如SUM/MIN/MAX等

 
    SELECT 
     departments.department_name 
    , LISTAGG (employees.first_name || employees.last_name, '; ') 
      WITHIN GROUP (ORDER BY employees.last_name,employees.last_name) employee_names 
    , SUM(employees.salary) 
    FROM employees 
    INNER JOIN departments ON employees.department_id = departments.department_id 
    WHERE departments.department_id = 100 
    GROUP BY 
     departments.department_name 
    ; 

注意我用的LISTAGG(),但你不必使用它。如果您的3列需要部门,部门经理和(工资总额),那么您需要从部门经理的部门表中选择正确的字段,然后在select和group by子句中包含该列。

0
WITH temp AS (
    SELECT d.department_name, concat(e.first_name, e.last_name) AS emp_name, 
     sum(e.salary) AS salary_sum 
    FROM employees e LEFT JOIN departments d ON e.department_id =d.department_id 
    WHERE d.department_id = 100 
    GROUP BY d.department_name, concat(e.first_name, e.last_name) ) 
SELECT t.department_name, t.emp_name, t.salary_sum 
INTO v_department_name, v_department_manager, v_totalsalary 
FROM temp 

此查询使用公共表格表达式将数据分组在一起以保持一切更一致。您正在收到错误,因为您在原始查询中缺少GROUP BY d.department_name, concat(e.first_name, e.last_name)行。 SUM()是一个聚合函数,只能与GROUP BY一起使用。