2017-07-10 3 views
0

特定のレポートエントリ 'warning'を持ち、その警告の説明が記載されているテーブルには表示されないすべてのシステムのID名をリストするSQL文があります。SQLカウントの偏差が2で

SELECT 
    systems.id, 
    systems.name 
FROM 
    systems 
    LEFT JOIN reports ON (reports.system_id = systems.id) 
    LEFT JOIN explanation_system_standards ON (reports.standard_id = explanation_system_standards.standard_id) 
WHERE 
    reports.status = 'warning' AND reports.datum = (SELECT MAX(datum) FROM reports) AND explanation_system_standards.dismissed_at IS NULL AND NOT EXISTS 
    (SELECT reports.standard_id 
    FROM explanation_system_standards 
    WHERE reports.standard_id = explanation_system_standards.standard_id AND reports.system_id = explanation_system_standards.system_id) 
GROUP BY systems.id 

このクエリは正確な出力を返します。このケースでは、explain_system_standardsテーブルに表示されないステータスが 'warning'のレポートエントリが6つあります。

psql -d bidlqa_development -f fl.sql | grep testserver.com 

396 | testserver.com 
396 | testserver.com 
396 | testserver.com 
396 | testserver.com 
396 | testserver.com 
396 | testserver.com 

ただし、COUNT経由で発生数を追加しようとすると、結果はすべてのシステムで+2になります。 explanation_system_standards.standard_idの、同じ関連付けを使用する表2の他のシステムがあるため、それは2を加算

SELECT 
    systems.id, 
    systems.name, 
    COUNT (systems.id) 
FROM 
    systems 
    LEFT JOIN reports ON (reports.system_id = systems.id) 
    LEFT JOIN explanation_system_standards ON (reports.standard_id = explanation_system_standards.standard_id) 
WHERE 
    reports.status = 'warning' AND reports.datum = (SELECT MAX(datum) FROM reports) AND explanation_system_standards.dismissed_at IS NULL AND NOT EXISTS 
    (SELECT reports.standard_id 
    FROM explanation_system_standards 
    WHERE reports.standard_id = explanation_system_standards.standard_id AND reports.system_id = explanation_system_standards.system_id) 
GROUP BY systems.id 

psql -d bidlqa_development -f fl.sql | grep testserver.com 
396 | testserver.com   |  8 

理由があります。誰も私はこのシステムの基本単位でカウントを与えるためにこのクエリを修正する方法を知っていますか?

EDIT:

私が代わりに私はあなたのカウントにCOUNT(DISTINCT reports.standard_id)

+1

このコードは機能しますか? COUNT –

+0

の前にカンマがありませんが、それは問題ではありません。コピーと貼り付けはここで間違っていました:-) –

+1

あなたの例は不明であり、あなたの質問に混乱を与えます。最初のクエリでは、 'GROUP BY systems.id'(非論理的な' SELECT'の集約関数なし)を行い、その結果は 'GROUP BY'クエリでは不可能な6つの同一行を示しています。次に、2番目の例で 'systems.id' 396は' testserver.com'から 'lqas4409.mod.nl'までの異なる' systems.name'を示しています。これをすべて書き換えて**明快さを加えてください**。 –

答えて

0

個別に必要なsystem.idのカウント、それを修正。

SELECT 
     systems.id, 
     systems.name, 
     COUNT (distinct systems.id) 
    FROM 
     systems 
     LEFT JOIN reports ON (reports.system_id = systems.id) 
     LEFT JOIN explanation_system_standards ON (reports.standard_id = explanation_system_standards.standard_id) 
    WHERE 
     reports.status = 'warning' AND reports.datum = (SELECT MAX(datum) FROM reports) AND explanation_system_standards.dismissed_at IS NULL AND NOT EXISTS 
     (SELECT reports.standard_id 
     FROM explanation_system_standards 
     WHERE reports.standard_id = explanation_system_standards.standard_id AND reports.system_id = explanation_system_standards.system_id) 
    GROUP BY systems.id 
+0

残念ながら、これにより、出力された出力(6)が(1)に減少します。システムごとに登録されていないエントリの数を取得しようとしています。したがって、report.status 'warning'に結合されているreports.standard.idがexplanation_system_standardテーブルに表示されない場合、これは1とカウントされます。 6を作る。 –