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

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

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

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

MySQL

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

903閲覧

SQL文で質問です。

usa_mal

総合スコア16

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

MySQL

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/03/01 14:27

前提・実現したいこと

MySql, Rails で質問です。sql初心者です。
下記のような4つのテーブル、モデルがあったとして、

【group】

idname
1a

【item】

idgroup_idnameamount
11donut2
21cake5

【item_material】

iditem_idmaterial_iduse
1115
2125
32110
42210

【material】

idname
1sugar
2flour

model

rails

1class Group < ApplicationRecord 2 has_many :items 3end 4 5class Item < ApplicationRecord 6 belongs to :group 7 has_many :item_materials 8 has_many :materials, through: :item_materials 9end 10 11class ItemMaterial < ApplicationRecord 12 belongs to :items 13 belongs to :materials 14end 15 16class Material < ApplicationRecord 17 has_many :item_materials 18 has_many :items, through: :item_materials 19end

やりたいことは、group_id が1の
item の amount と item_material の use を掛けたものの
合計を取得したいです(material_idでgroup byして、material.nameまで取得)。

最終的に欲しいデータは以下のようなイメージです

idmaterial.namesum(item.amount * item_material.use)
1sugar60
2flour75

発生している問題・エラーメッセージ

Every derived table must have its own alias

該当のソースコード

select item_materials.material_id, item_materials.material_name, sum(total) as sum_use from ( select (item_materials.use * items.amount) as total from ( select item_materials.*, items.id as i_id, items.group_id, items.amount from item_materials left outer join items on item_materials.item_id = items.id where items.group_id = 1) as im left outer join (select materials.id, materials.name from materials) on im.material_id = materials.id ) item_materials group by item_materials.material_id

試したこと

上記コードを試しましたがエラーが出てしまい、うまくいきません。

少しややこしいですが、ご教授お願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

railsの部分は分かりませんが、出力されているSQLは文法エラーです。
以下のようにならなければなりません。

SQL

1select item_materials.material_id, item_materials.material_name, sum(total) as sum_use 2from ( 3 select im.* 4 , (im.use * im.amount) as total 5 from ( 6 select item_materials.*, items.id as i_id, items.group_id, items.amount 7 from item_materials 8 left outer join items 9 on item_materials.item_id = items.id 10 where items.group_id = 1 11 ) as im 12 left outer join ( 13 select materials.id, materials.name from materials 14 ) as materials 15 on im.material_id = materials.id 16 ) item_materials 17group by item_materials.material_id, item_materials.material_name

投稿2020/03/01 15:02

編集2020/03/01 15:46
sazi

総合スコア25195

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

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

usa_mal

2020/03/01 15:37

ご回答ありがとうございます。頂いたクエリ文を試してみたのですが、 Unknown column 'item_materials.use' in 'field list' というエラーが出てしまいました。 item.materials テーブルに use カラムはあるのですが、、、
sazi

2020/03/01 15:47

演算している箇所は未編集でしたので、回答で訂正しておきました。
usa_mal

2020/03/01 23:26

できました!助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問