問題:
列の値の平均が特定の値よりも高いまたは低い行のグループを検索する必要があります。
例:
データベースには、product 次の列にデータがあります:id 、name 、grocery およびprice 。
| id | 名前 | 食料品 | 価格 |
|---|---|---|---|
| 1 | ミルク | グリーンショップ | 2.34 |
| 2 | パン | クラークの食料品 | 3.56 |
| 3 | パン | スーパーマーケット | 4.15 |
| 4 | ミルク | スーパーマーケット | 1.80 |
| 5 | パン | 食料品店アマンダ | 2.26 |
| 6 | ミルク | バイオレット食料品 | 3.45 |
| 7 | ミルク | クラークの食料品 | 2.10 |
| 8 | パン | バイオレット食料品 | 2.55 |
| 9 | ミルク | 食料品店アマンダ | 1.95 |
食料品の各商品の平均価格が3.00を超える商品の名前を見つけましょう。
解決策:
SELECT name, AVG(price) FROM product GROUP BY name HAVING AVG(price)>3.00;
結果は次のとおりです。
| name | avg |
|---|---|
| パン | 3.13 |
ディスカッション:
集計関数を使用してレコードをフィルタリングするには、HAVING句を使用します。
ここでは、集計値、つまり各製品の平均価格を計算します。 1つは複数の食料雑貨店で販売されています。したがって、平均価格はそれぞれについて計算されます(この例では、SELECT name, AVG(price) )。集計関数のほかに、SELECTで列名も使用するため、この列名(GROUP BY name)でGROUPBYを使用する必要があります。 )。
最後のステップは、HAVING句で集計関数を使用することです。 HAVINGはGROUPBY句の後に置く必要があることに注意してください。これには、集計関数によって返される値を指定された値と比較する条件が含まれています。上記は、値が3.00の製品の平均価格です(HAVING AVG(price)>3.00 )。このクエリでは、すべての食料品の各製品の平均価格が3より高いかどうかを確認します。クエリには、平均価格が3を超えるパンという1つの製品のみが表示されました。