0

一意のテーブルに、同じ参照情報 ( ) を持つ複数の行がありますID。同じ についてday、顧客が持っていdrinkて、Appreciationは 1 (はい) または 0 (いいえ) です。

Table 
ID   DAY Drink   Appreciation
1    1   Coffee   1
1    1   Tea      0
1    1   Soda     1
2    1   Coffee   1
2    1   Tea      1
3    1   Coffee   0
3    1   Tea      0
3    1   Iced Tea 1

私は最初に、特定の飲み物を誰が高く評価したかを確認しようとしましたが、これは明らかに非常に単純です

Select ID, max(appreciation)
from table 
where (day=1 and drink='coffee' and appreciation=1) 
or (day=1 and drink='tea' and appreciation=1)

飲み物にも興味がないので、以前maxは重複を削除して、評価の高いレーンだけを残していました。

しかし、私が今やりたいことは、実際に誰が飲んだすべての飲み物を高く評価しているかを確認することです. 繰り返しますが、最終的にはすべてのレーンに関心があるわけではなく、ID と感謝だけに関心があります。whereすべてのIDでそれを行うように変更するにはどうすればよいですか? 条件に ID を追加することもオプションではありません。に切り替えorてみましandたが、値が返されません。どうすればこれを行うことができますか?

4

1 に答える 1

1

これでうまくいくはずです:

SELECT ID
FROM table
WHERE DRINK IN ('coffee','tea') -- or whatever else filter you want.
group by ID
HAVING MIN(appreciation) > 0

それが行うことは次のとおりです。最小の評価を探し、グループ内のすべての行でそれが 0 より大きいことを確認します。グループは、group by 句で定義されている ID です。

ご覧のとおり、where セクションに集計関数を含めることができないため、having 句を使用しています。

もちろん、必要に応じて他のテーブルをクエリに結合できます。結合によって不要なフィルターを追加しないように注意してください。これにより、このクエリのデータセットが減少する可能性があります。

于 2013-07-04T15:53:32.350 に答える