SQL SELECT 对值求和,不包括重复项

标签 sql oracle select group-by sum

我在 Oracle SQL 中遇到一个问题,我正在尝试解决这个问题。

我将用一个例子来说明。我正在查询三个表:

Employees
__________________________________________
| EmployeeID | Name                      |
| 1          | John Smith                |
| 2          | Douglas Hoppalot          |
| 3          | Harry Holiday             |
... 



InternalCosts
________________________________
| IntID | Amount | EmployeeID  |
| 1     | 10     |     1       |
| 2     | 20     |     2       |
| 3     | 30     |     1       |
...


ExternalCosts
________________________________
| ExtID | Amount | EmployeeID  |
| 1     | 40     |     1       |
| 2     | 50     |     2       |
| 3     | 60     |     1       |
...

我想要实现的是每个员工一行的结果,以及他们每个内部和外部成本的总和,即

____________________________________________________________
| Name             | InternalCostTotal | ExternalCostTotal |
| John Smith       | 40                | 100               |
| Douglas Hoppalot | 20                | 50                |
...

我遇到的问题是,当我查询InternalCosts 和ExternalCosts 表时,我得到每种成本的排列,而不仅仅是每个员工的一种。当我按员工姓名分组并对金额字段求和时,值太高。我尝试过的:

SELECT emp.Name, sum(int.Amount), sum(ext.Amount) 
FROM Employees emp,
     InternalCosts int,
     ExternalCosts ext
WHERE emp.EmployeeId = int.EmployeeID
  and emp.EmployeeID = ext.EmployeeID
GROUP BY emp.Name

上面的示例将返回:

 ____________________________________________________________
 | Name             | InternalCostTotal | ExternalCostTotal |
 | John Smith       | 80                | 200               | <- too high!
 | Douglas Hoppalot | 20                | 50                |
 ...

感谢任何帮助/建议/想法!

最佳答案

您应该对 int 和 ext 使用子查询来求和,然后加入到子查询中。

我还建议使用显式联接而不是表、表、表

例如

SELECT emp.Name, int.Amount AS InternalCostTotal, ext.Amount AS ExternalCostTotal
FROM Employees emp
JOIN ( 
    SELECT EmployeeID, SUM(Amount) AS Amount 
    FROM InternalCosts 
    GROUP BY EmployeeID 
) int ON emp.EmployeeId = int.EmployeeID
JOIN ( 
    SELECT EmployeeID, SUM(Amount) AS Amount 
    FROM ExternalCosts 
    GROUP BY EmployeeID 
) ext ON emp.EmployeeId = ext.EmployeeID

关于SQL SELECT 对值求和,不包括重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31427071/

相关文章:

oracle - 完全用PL/SQL编写大型批处理程序是不是很愚蠢?

php - 使用 mysql 查询邮件检索

mysql - 在联接表中的 MIN 和 MAX 日期之间

sql - SQL 查询中的 MS Access VBA 数据类型不匹配错误

mysql - 根据条件更新另一个表的表

asp.net - Oracle.DataAccess.dll 虽然存在但无法定位

java - 按下提交按钮后显示 404 错误并带有 Controller 消息如何解决

sql - 在 Oracle 中格式化表中的电话号码

database - TYPO3:带有 where 子句的 exec_SELECTquery

mysql - 如何从另一个表中的字段获取计数 - MySQL