2012-11-07 73 views
4

我有一個問題從我的SQL語句中獲取我想要的結果。我知道我可能錯過了一些簡單的東西,但我看不到它。SQL語句Subs 0沒有結果

這是我的表格。

Table: Users(RoleID is linked to ID in Roles Table) 
ID, FirstName, LastName, RoleID 
1, Matt,  Ryan,  1 
2, Chipper,  Jones,  1 
3, Julio,  Jones,  2 
4, Jason,  Bourn,  3 

Table: Roles 
ID, Name 
1,  Field Rep 
2,  Tech 
3,  Admin 

Table: FRrequests(UserID is linked to ID in Users table) 
ID, UserID, Status 
1, 1,   Open 
2, 1,   Submitted 
3, 1,   Delayed 
4, 1,   Complete 

我要的是一個SQL語句,顯示我所有的「提交」 &「延遲」爲所有現場代表請求的計數。以下是理想的結果的一個例子。

 
Name    Count 
Chipper Jones 0 
Matt Ryan  2 

這是我迄今爲止的聲明以及它給我的結果。

 
SELECT Users.FirstName + ' ' + Users.LastName AS Name, COUNT(FRrequests.ID) AS 'Open Requests' 
FROM Users INNER JOIN 
      Roles ON Users.RoleID = Roles.ID LEFT OUTER JOIN 
      FRrequests ON Users.ID = FRrequests.UserID 
WHERE (Roles.Name = N'Field Rep') AND (FRrequests.Status = 'Submitted' OR FRrequests.Status = 'Delayed') 
GROUP BY Users.FirstName, Users.LastName 

Name    Count 
Matt Ryan  2 

我知道了 「AND(FRrequests.Status = '提交' OR FRrequests.Status = '延遲')」 部分是什麼打破它。如果我在聲明中沒有運行它,我會獲得所有用戶,但它不僅僅是提交併延遲了所有狀態。我只是無法弄清楚我錯過了什麼才能使其發揮作用。任何幫助將不勝感激。

回答

1

你是真的很近,請嘗試以下操作:

SELECT U.FirstName + ' ' + U.LastName AS Name, COUNT(F.ID) AS 'Open Requests' 
FROM Users U 
INNER JOIN Roles R 
    ON U.RoleID = R.ID 
LEFT JOIN (SELECT * FROM FRrequests 
      WHERE Status IN ('Submitted','Delayed')) F 
    ON U.ID = F.UserID 
WHERE R.Name = N'Field Rep' 
GROUP BY U.FirstName, U.LastName 
+0

完美地工作。感謝您的幫助和快速的響應時間。 :) – cdouglas10683

0

你需要有一排各領域代表,如果你希望包括不具有請求現場代表。因此,你需要使用一個左外連接大意如下:

SELECT 
    u.FirstName || ' ' || u.LastName as Name 
    , COALESCE(frr.Counter,0) as Count 
FROM 
    Users u 
    LEFT OUTER JOIN ( 
     SELECT 
      UserID 
      ,count(*) as Counter 
     FROM 
      FRrequests 
     WHERE 
      Status IN ('Submitted', 'Delayed') 
     GROUP BY 
      UserID 
    ) frr ON frr.UserID = u.ID 
    , Roles r 
WHERE 
    u.ID = f.UserID 
    AND u.RoleID = r.ID 
    AND r.Name = 'Field Rep' 
; 

左外連接將只提供其中一個匹配發生一個連接,所以它不會刪除從自然加入了設定的行。在這種情況下,您將獲得所有現場代表用戶的列表,以及具有「已提交」或「已延遲」狀態的FR請求計數(如果有)。

COALESCE用於(至少在Postgresql中)檢查空值,然後將其強制爲提供的值,在此情況下爲0.所以,如果發生NULL值(例如,因爲沒有'Counter '從左外連接返回的值)將其替換爲0.