2017-08-12 126 views
1

我使用的是SQL Server和有以下3个表:更新列值在多个表的多个值的总和,对于每一行

  1. Employees有列NameSalesBonus1Bonus2
  2. Departments有列NameScore
  3. DepartmentsMembers有列NameEmployees.Name),部门(Departments.Name

如何计算和更新基础上的Sales + Bonus1 + Bonus2属于该部门的雇员的总和为每个部门Score列中的值?

编辑:

基于阿里Adlavaran的答案,我得到这个查询返回与各部门的结果列表及其计算Score

SELECT 
    DepartmentsMembers.Name, SUM(Sales + Bonus1 + Bonus2) 
FROM 
    DepartmentsMembers Department 
INNER JOIN 
    DepartmentsMembers ON Departments.Name = DepartmentsMembers.Name 
INNER JOIN 
    Employees ON DepartmentsMembers.Name = Employees.Name 
WHERE 
    DepartmentsMembers.Name = Departments.Name 
GROUP BY 
    DepartmentsMembers.Name 

我怎样才能把所有的更新声明,每个部门?

谢谢。

+1

好吧,如果你需要* *这一点,那么也许你应该写一个SQL'UPDATE'声明要做到这一点。请注意,StackOverflow不是一个为我工作的网站。这是针对*特定*编程问题的问答+网站,即使您单击了一个名为“Ask Question”的按钮以输入该文本,您甚至还没有问过任何问题。请阅读[帮助中心](https://stackoverflow.com/help)以了解[适合问问](https://stackoverflow.com/help/on-topic),以及如何[问问好问题](https://stackoverflow.com/help/how-to-ask)。 – Andreas

+0

感谢您的反馈。我在注册时阅读过这些内容,并且还阅读并尝试从以前似乎相关的问题中弄清楚这一点。然而,目前的逻辑失败了我如何链接这些3.我发布这种方式,希望看到这个“问题”更“从头开始”。 – Razvan

回答

0

首先,由部门总结:

SELECT dm.Department, 
     SUM(COALESCE(e.Sales, 0) + COALESCE(e.Bonus1, 0) + COALESCE(e.Bonus2, 0)) as total 
    FROM DepartmentsMembers dm INNER JOIN 
     Employees e 
     ON dm.EmployeeName = e.Name 
GROUP BY dm.Department; 

然后,您可以使用此在部门更新:

UPDATE d 
    SET Score = de.total 
    FROM Departments d JOIN 
     (SELECT dm.Department, 
       SUM(COALESCE(e.Sales, 0) + COALESCE(e.Bonus1, 0) + COALESCE(e.Bonus2, 0)) as total 
      FROM DepartmentsMembers dm INNER JOIN 
       Employees e 
       ON dm.EmployeeName = e.Name 
      GROUP BY dm.Department 
     ) de 
     ON de.Department = d.Name; 

编辑:

如果你想确保所有部门得到更新,然后用LEFT JOIN

UPDATE d 
    SET Score = COALESCE(de.total, 0) -- only needed if you don't want `NULL`s 
    FROM Departments d LEFT JOIN 
     (SELECT dm.Department, 
       SUM(COALESCE(e.Sales, 0) + COALESCE(e.Bonus1, 0) + COALESCE(e.Bonus2, 0)) as total 
      FROM DepartmentsMembers dm INNER JOIN 
       Employees e 
       ON dm.EmployeeName = e.Name 
      GROUP BY dm.Department 
     ) de 
     ON de.Department = d.Name; 
+0

工作完美,谢谢! – Razvan

+0

这不会更新没有员工的部门的分数。你可能认为这是不必要的,但是如果一个部门有一名雇员,因此一个非零分数,并且雇员离开,这个答案中的陈述不会将得分重置为零,但在最后一个非零时保持不变价值到位。 – Andreas

+0

@Andreas。 。 。如果这是一个要求,那么逻辑很容易改变(使用'LEFT JOIN'而不是'JOIN')。我没有得到这个要求。 –

0

它应该是这样的:

UPDATE Departments 
SET Score = 
(
    SELECT SUM(Sales + Bonus1 + Bonus2) 
    FROM DepartmentsMembers 
    INNER JOIN Employees ON Employees.Name = DepartmentsMembers.Name 
    WHERE DepartmentsMembers.Department = Departments.Name 
    GROUP BY DepartmentsMembers.Department 
) 

我希望能为您有所帮助:)

+0

谢谢!查询运行,但停止与“不能将值NULL插入列'Score',表'klip.dbo.Departments';列不允许NULL,UPDATE失败。” 如果我单独运行SELECT部分​​,它将停止并且“多部分标识符”Departments.Name“无法被绑定。“ – Razvan

+0

@Razvan在你的问题中,你没有说'Score'被定义为'NOT NULL'假设当部门没有雇员时你希望值为'0',改为'COALESCE(SUM(Sales + Bonus1 + Bonus2),0)' – Andreas

+0

'GROUP BY'是不必要的 – Andreas