2011-02-04 33 views
0

我想創建一個查詢,顯示員工的姓名和所有未關閉的服務的總和。查詢的結果沒有給我正確的價值。SQL查詢中的計數問題

這裏是我的查詢:

SELECT DISTINCT 
     a.AssignedEmp, 
     COUNT(a.TipoStatus) AS 'Service Request Count' 
    FROM Service a, 
     employee b 
    WHERE b.Classification_ClassificationID = 2 
    AND a.TipoStatus = 'Open' 
    OR a.TipoStatus = 'Pending' 
    OR a.TipoStatus = 'Hold' 
    OR a.TipoStatus = 'Warranty' 
    AND a.AssignedEmp = b.UserName 
GROUP BY a.AssignedEmp 
    LIMIT 0, 30 

有導致此查詢給我的是:

dpadil 16 
epadil  8 

的正確值應該是2和1

+0

這是MySQL,SQLite還是PostgreSQL? – 2011-02-04 02:21:36

+1

@OMG,你意識到還有其他_ DBMS',當然? :-) – paxdiablo 2011-02-04 02:23:55

回答

2

您需要括號的邏輯與的條件(並應使用JOIN表示法):

SELECT DISTINCT 
     a.AssignedEmp, 
     COUNT(a.TipoStatus) AS 'Service Request Count' 
    FROM Service AS a 
    JOIN employee AS b ON a.AssignedEmp = b.UserName 
WHERE b.Classification_ClassificationID = 2 
    AND (a.TipoStatus = 'Open' 
    OR a.TipoStatus = 'Pending' 
    OR a.TipoStatus = 'Hold' 
    OR a.TipoStatus = 'Warranty') 
GROUP BY a.AssignedEmp 
LIMIT 0, 30 

或者你也可以直接在「不封閉」條款寫入條件:

SELECT DISTINCT 
     a.AssignedEmp, 
     COUNT(a.TipoStatus) AS 'Service Request Count' 
    FROM Service AS a 
    JOIN employee AS b ON a.AssignedEmp = b.UserName 
WHERE b.Classification_ClassificationID = 2 
    AND a.TipoStatus != 'Closed' 
GROUP BY a.AssignedEmp 
LIMIT 0, 30 

按照最初寫的,在WHERE子句等同於:

WHERE (b.Classification_ClassificationID = 2 AND a.TipoStatus = 'Open') 
    OR a.TipoStatus = 'Pending' 
    OR a.TipoStatus = 'Hold' 
    OR (a.TipoStatus = 'Warranty' AND a.AssignedEmp = b.UserName) 

這將爲用戶計數分類ID爲2的所有Open服務項目;它還會統計所有待處理服務項目,而不考慮分類標識,以及所有保留服務項目而不考慮分類標識,以及分配給用戶的所有保修服務項目,而不考慮分類標識。 GROUP BY對事物進行過濾,以便只計算具有分配給員工的權利的項目,但是對於某些術語存在部分交叉產品,從而導致虛增。

3

第一你應該做的事情是擺脫countgroup by

這會給你實際的正在使用,並可能直接顯示你的問題。

比率正確的事實(16:8 = 2:1)通常表示AND a.AssignedEmp = b.UserName不像您想象的那樣有限制。

換句話說,交叉表連接更加多產。讓行自己出來應該可以幫助你理解爲什麼。

0

您可能想要更明確地構建您的條件。

您還應該使用JOIN聲明而不是附加條件來指定JOIN條件。

SELECT DISTINCT   
a.AssignedEmp,   
COUNT(a.TipoStatus) AS 'Service Request Count'  
FROM Service a 
     INNER JOIN employee b 
     ON a.AssignedEmp = b.UserName 
WHERE b.Classification_ClassificationID = 2  
    AND (
     a.TipoStatus = 'Open'  
     OR a.TipoStatus = 'Pending'  
     OR a.TipoStatus = 'Hold'  
     OR a.TipoStatus = 'Warranty' 
     ) 
GROUP BY a.AssignedEmp  
    LIMIT 0, 30