P159の例題 : グループに分けて条件付けて取り出す。 | ||||||||||||||||||
「HAVING」で設定する条件は、グループ化した値に対するものです。では、実際にやってみましょう。 | ||||||||||||||||||
「売上合計を社員番号ごとに処理するけど、表示するのはグループの合計が200以上でけ」という条件を設定します。 | ||||||||||||||||||
具体的には、テーフ゛ル「tb」でカラム「bang」ごとに「カラムuriaの合計が200以上」である「カラムbang」と | ||||||||||||||||||
「カラムuriaの合計」を表示します。 | ||||||||||||||||||
・・・▶ | 実行される内容 | |||||||||||||||||
▶実行前(テーフ゛ル「tb」) | @グループの合計が200以上のもの | Aグループの合計が200以上のものを グループごとにソートする |
Bカラム「bang」ごとに「カラムuria合計」を表示する | |||||||||||||||
bang | uria | tuki | bang | uria | tuki | bang | uria | tuki | bang | sum(uria) | ||||||||
A103 | 101 | 4 | A102 | 54 | 5 | A101 | 184 | 4 | A101 | 484 | ||||||||
A102 | 54 | 5 | A104 | 181 | 4 | A101 | 300 | 5 | A102 | 259 | ||||||||
A104 | 181 | 4 | A101 | 184 | 4 | A102 | 54 | 5 | A104 | 274 | ||||||||
A101 | 184 | 4 | A101 | 300 | 5 | A102 | 205 | 6 | ||||||||||
MySQ実行コマンド | A103 | 17 | 5 | A102 | 205 | 6 | A104 | 181 | 4 | |||||||||
select | A101 | 300 | 5 | A104 | 93 | 5 | A104 | 93 | 5 | |||||||||
bang,sum(uria) | A102 | 205 | 6 | |||||||||||||||
from tb | A104 | 93 | 5 | |||||||||||||||
group by bang B | A103 | 12 | 6 | |||||||||||||||
having sum(uria)>=200; B | A107 | 87 | 6 | |||||||||||||||
実行結果 | ||||||||||||||||||
mysql> select bang,sum(uria) from tb group by bang having sum(uria)>=200; | ||||||||||||||||||
+------+-----------+ | ||||||||||||||||||
| bang | sum(uria) | | ||||||||||||||||||
+------+-----------+ | ||||||||||||||||||
| A101 | 484 | | 実行コマンドの解説 | bang,uria(sum) | ||||||||||||||||
| A102 | 259 | | from tb | |||||||||||||||||
| A104 | 274 | | group by bang ; | bangを group byでグループ化した結果が以下です。 | ||||||||||||||||
+------+-----------+ | 実行結果 | |||||||||||||||||
3 rows in set (0.03 sec) | mysql> select bang,sum(uria) from tb group by bang; | |||||||||||||||||
+------+-----------+ | ||||||||||||||||||
| bang | sum(uria) | | ||||||||||||||||||
+------+-----------+ | ||||||||||||||||||
| A101 | 484 | | ||||||||||||||||||
| A102 | 259 | | ||||||||||||||||||
| A103 | 130 | | ||||||||||||||||||
| A104 | 274 | | ||||||||||||||||||
| A107 | 87 | | ||||||||||||||||||
+------+-----------+ | ||||||||||||||||||
5 rows in set (0.00 sec) | ||||||||||||||||||
問題2 次のテーフ゛ル「tb」で、カラム「uria」が50以上のデータだけを対象にして、「bang」ごとの「uria」の平均で120以上のものだけを、「uria」の平均の多いものから表示してください。 | ||||||||||||||||||
▶テーフ゛ル[tb] | @ [uria]が50以上のデータ | A [bang]ごとの[uria]の平均で120以上 | B [uria]の平均の多いもの | |||||||||||||||
bang | uria | tuki | bang | uria | tuki | bang | uria | tuki | bang | uria(avg) | ||||||||
select bang,AVG(uria) @ | A103 | 101 | 4 | A103 | 101 | 4 | A101 | 184 | 4 | A101 | 242 | |||||||
FROM tb | A102 | 54 | 5 | A102 | 54 | 5 | A101 | 300 | 5 | A104 | 137 | |||||||
WHERE uria>=50 @ | A104 | 181 | 4 | A104 | 181 | 4 | A102 | 54 | 5 | A102 | 129 | |||||||
GROUP BY bang B | A101 | 184 | 4 | A101 | 184 | 4 | A102 | 205 | 6 | |||||||||
HAVING AVG(uria)>=120; A | A103 | 17 | 5 | A101 | 300 | 5 | A104 | 181 | 4 | |||||||||
ORDER BY AVG(uria) DESC; B | A101 | 300 | 5 | A102 | 205 | 6 | A104 | 93 | 5 | |||||||||
A102 | 205 | 6 | A104 | 93 | 5 | |||||||||||||
A104 | 93 | 5 | A107 | 87 | 6 | |||||||||||||
A103 | 12 | 6 | ||||||||||||||||
A107 | 87 | 6 | ||||||||||||||||
select bang,AVG(uria) FROM tb WHERE uria>=50 GROUP BY bang HAVING AVG(uria)>=120 ORDER BY AVG(uria) DESC; |