2016-12-08 97 views
2

我有數據庫,如圖表所示(見下圖) enter image description hereSQL JOIN子句條件

我的任務是顯示每個員工處理訂單的總價值。 我有SQL語句:

SELECT e.FirstName, 
     e.LastName, 
     SUM(od.Quantity * od.UnitPrice * (1-od.Discount)) 
FROM Orders AS o 
JOIN Employees AS e 
ON o.EmployeeID = e.EmployeeID 
JOIN [Order Details] AS od 
ON o.OrderID = od.OrderID 
GROUP BY e.FirstName,e.LastName 

我有進一步的步驟問題。我需要的結果只有有限的那些員工:

  • A)有員工在他們
  • B)不要有下他們的任何員工

我知道它在員工的關心領域的上級表,但我不知道如何得到正確的SQL子句。我應該用「EXISTS」還是自加入?

謝謝。

+0

你的關鍵是A中的第1個字和第2個字b中。它的SQL關鍵字HAVING :) – logixologist

回答

1

是的,只要使用存在。

Where Exists(Select 1 from Employees where ReportsTo = e.EmployeeId) 
+0

如果只有1級報告,則可以使用。如果您有多層人員(Sam向Janet報告,向Amit報告給Trevor),則此查詢僅在您查詢Trevor的報告時纔會獲得Amit的訂單。 – HLGEM

+0

但這就是他所需要的。他不需要知道是否有多個級別。他只需要知道該人是否有人向他們彙報。 –

+0

如果您需要遞歸級別,您可以使用CTE和Union ALL –

1

使用自連接,試圖找人給他

SELECT e.FirstName, 
     e.LastName, 
     SUM(od.Quantity * od.UnitPrice * (1-od.Discount)) 
FROM Orders AS o 
INNER JOIN Employees AS e  
    ON o.EmployeeID = e.EmployeeID 
LEFT JOIN Employees as under -- self join 
    ON e.EmployeeID = under.ReportTo 
INNER JOIN [Order Details] AS od 
    ON o.OrderID = od.OrderID 
GROUP BY e.FirstName,e.LastName 

HAVING MAX(under.ReportTo) IS NULL  -- If doesnt find a match mean no one subordinate 
    -- MAX(under.ReportTo) IS NOT NULL -- mean have at least one subordinate 
+0

感謝您進行重播,但不幸的是聲明僅適用於: MAX(under.ReportTo)IS NOT NULL,MAX(under.ReportTo)IS NULL returns沒有結果。下面的@Dobbins聲明正常工作,解決存在條件的問題 – jadupl

+1

我調用了'LEFT'和'INNER'加入,請再次檢查。 –

+0

是的,現在工作正常。謝謝。 – jadupl

0

具有自報告加入可以潛在地產生重複這將是很難調試由於GROUP BYEXISTSWHERE子句中的相關子查詢將是我將如何完成此操作。

SELECT * 
FROM Employees e 
WHERE EXISTS(
    SELECT 1 
    FROM Employees _e 
    WHERE _e.ReportsTo = e.EmployeeID) 

在您的查詢:

SELECT e.FirstName, 
     e.LastName, 
     SUM(od.Quantity * od.UnitPrice * (1-od.Discount)) 
FROM Orders AS o 
JOIN Employees AS e 
ON o.EmployeeID = e.EmployeeID 
JOIN [Order Details] AS od 
ON o.OrderID = od.OrderID 
WHERE /*NOT*/ EXISTS(
    SELECT 1 
    FROM Employees _e 
    WHERE _e.ReportsTo = e.EmployeeID) 
GROUP BY e.FirstName,e.LastName