2009-03-15 6 views
15

SQLiteバージョン3.4.0 集計関数の何が問題になっていますか?さらに、私はORDER BYもうまくいかないと思う。これを書き直すには?SQLエラー:集計の誤用

sqlite> SELECT p1.domain_id, p2.domain_id, COUNT(p1.domain_id) AS d1, COUNT(p2.domain_id) AS d2 
    ...> FROM PDB as p1, Interacting_PDBs as i1, PDB as p2, Interacting_PDBs as i2 
    ...> WHERE p1.id = i1.PDB_first_id 
    ...> AND p2.id = i2.PDB_second_id 
    ...> AND i1.id = i2.id 
    ...> AND d1>100 
    ...> AND d2>100 
    ...> ORDER BY d1, d2; 
SQL error: misuse of aggregate: 
sqlite> 

答えて

55

集計関数(sum/count/...)を使用する場合は、GROUP BY句も使用する必要があります。

次に、集計の結果をフィルタリングする場合は、WHERE句でそれを行うことはできませんが、HAVING句で行う必要があります。このため

SELECT p1.domain_id, p2.domain_id, COUNT(p1.domain_id) AS d1, COUNT(p2.domain_id) AS d2 
    FROM PDB as p1, Interacting_PDBs as i1, PDB as p2, Interacting_PDBs as i2 
    WHERE p1.id = i1.PDB_first_id 
    AND p2.id = i2.PDB_second_id 
    AND i1.id = i2.id 
GROUP BY p1.domain_Id, p2.domain_Id 
HAVING d1 > 100 AND d2 > 100 
ORDER BY d1, d2; 
+3

+1適切なGROUP BY句がない集計関数の使用は、MySQLから引き継がれた悪い習慣に根ざしていると思います... – Tomalak

+1

この回答は構文を覚えようと多くの時間を節約しました。説明を理解する。乾杯@Frederik – OptimizePrime

+0

私のための列を除外していない! –

2

ショートバージョンの修正は次のとおりです。

あなたはCOUNT/SUMのような機能を使用している、あなたはHAVINGの代わりWHEREを使用する必要があります。