查询SUM的SQL查询

时间:2014-10-23 07:51:00

标签: sql oracle sum schema

我是SQL的新手,我一直在努力编写这个查询。我想找到给予部门员工所有工资的总和,让我们说'M',给定的雇用日期,比如'2002',任何想法?我想我必须以某种方式加入表格但遇到麻烦,我已经设置了这样的架构。

作业表和列

JOBS
------------
job_id
salary
hire_date

员工表和列

EMPLOYEES
------------
employee_id
name
job_id
department_id

部门表和列

DEPARTMENTS
------------
department_id
department_name

这与HR模式在Oracle中的表现方式非常相似,所以我认为架构应该没问题,现在只需要查询帮助。

3 个答案:

答案 0 :(得分:2)

您需要这样的声明:

    SELECT e.name, 
           d.department_name, 
           SUM(j.salary)
      FROM employees e, 
           departments d, 
           jobs j
     WHERE d.department_name = 'M' 
       AND TO_CHAR(j.hire_date, 'YYYY') = '2002'
       AND d.department_id = e.department_id 
       AND e.job_id = j.job_id
  GROUP BY e.name, 
           d.department_name;

答案 1 :(得分:1)

FWIW,您不应使用旧的ANSI-89 implicit join notation(使用,)。它被认为是自ANSI-92标准(超过20年前!)以来已弃用,并且一些供应商开始放弃其支持(MS SQL Server 2008;我不知道Oracle的这个“功能”是否存在弃用警告?)。

所以,作为新手,你不应该从一开始就学习bad habits

使用“现代”语法,您的查询应该写成:

SELECT e.name, 
       d.department_name, 
       SUM(j.salary)
  FROM employees e
  JOIN departments d USING(department_id)
  JOIN jobs j USING(job_id)

 WHERE d.department_name = 'M' 
   AND TO_CHAR(j.hire_date, 'YYYY') = '2002'

 GROUP BY e.name, d.department_name;

使用该语法,JOIN关系(USINGON)与过滤条款WHERE之间存在明显区别。当您遇到OUTER JOIN等“高级”联接时,它会稍后放松一下。

答案 2 :(得分:-1)

是的,你只需要在所有三个表之间进行简单的内部连接。

SELECT SUM(salary)
FROM JOBS j
JOIN EMPLOYEES e ON j.job_id = e.job_id
JOIN DEPARTMENTS d ON e.department_id = d.department_id
WHERE d.department_name = 'M'
AND e.hire_date = 2002