質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

444閲覧

MySQL GROUP_BY 文法、仕様

williamsArk

総合スコア46

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2020/05/08 05:44

イメージ説明

上記のようなテーブルを作りました。
MySQLのグループ仕様が良く分からず、色々試しております。

SELECT * FROM tb_sales GROUP BY bang;

これをやるとエラーになりますが、それはMySQLのバージョンの仕様によるものだそうです。GROUP_BYで指定しなかったbang以外も*で選んでしまっているという事でしょうか。

'''
SELECT bang FROM tb_sales GROUP BY bang; とするとbang=bangになるので、以下の様に表示されました。

![イメージ説明](576d1019cc12f303865a204b3b29df32.png) でもこれでは物足りないので、 SELECT bang, AVG(uria) FROM tb_sales GROUP_BY bang; とすると、以下の様になりました。望んだとおりです。 ![イメージ説明](f2ea10cf3f649fc1ae47dd89f607d69c.png) tukiでグループ分けできないかと思い、以下の様にしてみました。 SELECT bang, AVG(uria), tuki FROM tb_sales GROUP BY tuki;  するとエラーが出てしまいます。 GROUP_BYの仕様がまだ苦手なのですが、何が良くないのでしょうか?因みにSELECT AVG(uria), tukiだけだと成功します。 GROUP_BYで指定しなかったものはSELECTできない、と言うのは承知ですが、でも SELECT bang, AVG(uria) FROM tb_sales GROUP_BY bang;は出来ています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2020/05/08 07:33 編集

GROUP_BY ↓ GROUP BY アンダーバーを入れる習慣は悔い改めて直してください。エラーになります。
williamsArk

2020/05/08 12:18

確かにそうですね。それは肝に銘じておきます。ありがとうございます。
Orlofsky

2020/05/12 02:36

ここの掲示板は質問を修正できます。 すぐ直しなさい。
guest

回答2

0

bang毎のuriaの平均値を求める場合、以下でも結果は求められます。

SQL

1SELECT AVG(uria) FROM tb_sales GROUP_BY bang

ただ、bangもselectしないと、どのbangのavg()か分からないので、bangをselectします。

SQL

1SELECT bang, AVG(uria) FROM tb_sales GROUP_BY bang

とするわけです。

同じように、tuki 毎の集計を行うなら

SQL

1SELECT tuki, AVG(uria) FROM tb_sales GROUP_BY tuki

です。
ここで、bangも表示させたいなら、それは(bang, tuki)毎の集計になるわけで

SQL

1SELECT bang, tuki, AVG(uria) FROM tb_sales GROUP_BY bang, tuki

となります。

MySQLのモードで厄介なのは以下の記述でもエラーにならないモードがあることです。

SQL

1SELECT bang, tuki, AVG(uria) FROM tb_sales GROUP_BY tuki

但し、上記のbangはgroup byされている項目では無いので、MySQLは適当な値を出力します。

ですので、変な癖がつかないように最新のMySQLでのテキストを使用しての学習をお薦めする訳です。

投稿2020/05/08 09:02

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

williamsArk

2020/05/08 12:18

いつも助かっております。頂いた情報を精査しつつ、自分の物に図々しくもさせて頂きたく思います。
guest

0

ベストアンサー

GROUP_BYで指定しなかったものはSELECTできない、と言うのは承知ですが、でも

SELECT bang, AVG(uria) FROM tb_sales GROUP_BY bang;は出来ています。

GROUP BYで指定されていない項目をSELECT句に書く場合、グルーピングされていないためにどの行の情報を出力するのかが不定になります。

なので

SELECT bang, AVG(uria), tuki FROM tb_sales GROUP BY tuki; 

これだと、「tuki=4」の行が3行あり、それをひとつのグループとして取り扱った場合、bangのSELECTに表示する候補が「A101」「A103」「A104」と複数あるため、結果として「tuki=4」を1行にまとめることが出来ません。

AVG(uria)のように集計関数を使っている項目については、「tuki=4」に合致する行の「uriaの値の平均」という1行にまとめられるので表示できます。

つまり、GROUP BYで指定されていない項目をSELECT句で指定したい場合は、何らかの集計関数を使う必要があるということです。(MAXとかMINとかでもいい)

投稿2020/05/08 05:56

gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

williamsArk

2020/05/08 12:17

異常に分かりやすい説明ありがとうございました。おかげさまで大分進歩できそうです。もしかしたら何か質問があったら追記させて頂くかもしれませんが、なるべく自己解決を目指します(念のため)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問