2011-02-04 10 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用ですか? –

+1

@OMG、あなたは_other_ DBMS 'があることを認識しています。 :-) – paxdiablo

+2

@paxdiablo:私が知っているのは「LIMIT」だけです。そして、私を「シャーリー」と呼んではいけません:p –

答えて

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であるすべてのオープンサービス項目をカウントします。分類IDにかかわらず、すべての保留中のサービス項目、および分類IDに関係なく、すべての保留サービス項目、およびユーザーに割り当てられたすべての保守サービス項目をカウントします。 GROUP BYは、右側に割り当てられた従業員の項目だけがカウントされるようにフィルタリングしますが、用語の一部には部分的な積が存在し、膨大なカウントにつながります。

+0

これは完璧に動作します!ジョナサンと助けてくれた皆さん、ありがとう! – maltad

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