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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

5033閲覧

2つのテーブルを結合・集計するSQL文を書きたい

ARIA-0

総合スコア11

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/04/27 09:09

編集2020/04/27 09:21

前提・実現したいこと

user

codename
1太郎
2花子
3二郎

price

codeuser_idprice
11300
21400
32500
43800
52100

このような2つのテーブルから、人物毎の金額合計を多い順に表示したい。

以下が表示後の理想です。

user_idnameprice
3二郎800
1太郎700
2花子600

該当のソースコード

sql

1SELECT user.name, price.user_id, SUM(price.price) FROM user JOIN price ON user.code=price.user_id GROUP BY user.name

現在は上のように書いています。
多い順への並び替えは最後に記述しようと思い、まだ書いていません。
ひとまず、結合・合計を表示したかったのですが、上のコードだとエラーが出てしまいます。

SELECT user.name, reward.user_id, SUM(reward.reward) FROM user JOIN reward ON user.code=reward.user_id GROUP BY user.name LIMIT 0, 30
#1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.reward.user_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

試したこと

SUM()と GROUP BY user.nameの記述を消すとエラーは消えて以下のように表示されます。

user_idnameprice
1太郎300
1太郎400
2花子500
3二郎800
2花子100

なので、SUMやGROUP BYの書き方に問題があるのはわかるのですが、どのように直せば解決できるのかがわかりません。
わかる方いましたら、教えていただけると幸いです。
よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

MySQLを使っています。

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

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

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

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

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

gentaro

2020/04/27 09:14

「エラーが出てしまいます」じゃ伝わらないので、正確なエラーメッセージを含めて質問文に書いてください。 あと使ってるDBMSも。 とりあえず「JOIN price ON user.code=price.user_id」の箇所は「user.code」なんて上記の定義の中には出てきてない項目なんで、エラーになって当然だろうとは思いますが。
gentaro

2020/04/27 09:19

あとこれも基本的なところで、GROUP BYに含まれない項目をSELECT句で使う場合はSUMなりMAXなりMINなり、何らかの集計対象にしないといけません。 おそらく理解できてないのはこのあたりだと思います。 userIdでGROUP BYしてSELECTではuserIdと金額のSUMだけ指定したものをサブクエリとして、そのサブクエリにその他必要なマスタ情報(この場合はuserの名前)はJOINして持ってこればたぶん完成します。
ARIA-0

2020/04/27 09:30

質問文に不備があったにもかかわらず、詳しく教えていただきありがとうございます。 言われた通り修正してみると解決することができました。 ありがとうございました。
guest

回答1

0

ベストアンサー

コメントで完結しちゃったけど解決したらしいのでこれを回答としておきます。

あとこれも基本的なところで、GROUP BYに含まれない項目をSELECT句で使う場合はSUMなりMAXなりMINなり、何らかの集計対象にしないといけません。

おそらく理解できてないのはこのあたりだと思います。
userIdでGROUP BYしてSELECTではuserIdと金額のSUMだけ指定したものをサブクエリとして、そのサブクエリにその他必要なマスタ情報(この場合はuserの名前)はJOINして持ってこればたぶん完成します。

投稿2020/04/27 09:40

gentaro

総合スコア8949

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

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

ARIA-0

2020/04/27 09:41

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問