2017-08-12 123 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