次の集計関数があると仮定します。
- AGG1
- AGG2
- AGG3
- AGG4
次のように有効な SQL を (db にとらわれない方法で) 書くことは可能ですか?
SELECT [COL1, COL2 ....], AGG1(param1), AGG2(param2) FROM [SOME TABLES]
WHERE [SOME CRITERIA]
HAVING AGG3(param2) >-1 and AGG4(param4) < 123
GROUP BY COL1, COL2, ... COLN
ORDER BY COL1, COLN ASC
LIMIT 10
ここで、COL1 ... COLN はクエリ対象のテーブル内の列であり、param1 ... paramX は AGG 関数に渡されるパラメーターです。
注: AGG1 と AGG2 は列として結果に返されます (ただし、HAVING CLAUSE には表示されず、AGG3 と AGG4 は HAVING CLAUSE に表示されますが、結果セットには返されません。
理想的には、ソリューションに対する DB にとらわれない回答が必要ですが、DB に縛られる必要がある場合は、PostgreSQL (v9.x) を使用しています。
編集
明確にするために、クエリで GROUP BY を使用することに反対しているわけではありません。私の SQL はあまり良くないので、上記の SQL の例は少し誤解を招く可能性があります。上記の疑似 sql ステートメントを編集して、私の意図をより明確にすることを願っています。
私が知りたかった主なことは、AGG 関数を使用した選択クエリが次のことができるかどうかでした。
- HAVING 句で指定せずに、返された列に集計関数の値を含めます。
- HAVING 句に集計関数が指定されていますが、結果セットには返されません。
私がこれまでに受け取った回答からすると、両方の質問に対する答えはイエスのようです。SQL を修正するために私がしなければならない唯一のことは、返される行が一意であることを確認するために GROUP BY 句を追加することです。