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

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

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

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

SQL

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

Q&A

解決済

1回答

1821閲覧

GROUP BYの使いどころを教えてください。

yyy

総合スコア49

MySQL

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

SQL

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

0グッド

0クリップ

投稿2016/02/08 08:20

###前提・実現したいこと
My SQLで都道府県別・商品別に、販売額の合計を一覧にして出したいのですが、うまくいきません。

###発生している問題・エラーメッセージ
県IDが同じ場合は顧客番号にかかわらず、販売合計金額を1つに纏めたいのですが、CustomerIDを結合したせいでGROUP BYがかからなくなっているようです。
(CustomerIDを消すと県IDが取れなくなってしまうので、今使用されているID,Name,テーブルはそのまま使用したいです。)

###ソースコード
My SQL

SELECT
A.PrefecturalID
,A.PrefecturalName
,I.ProductName
,G.販売合計金額
FROM
Prefecturals AS A
INNER JOIN
(
SELECT
b.PrefecturalID
,c.CustomerID
FROM
Prefecturals AS b
INNER JOIN
Customers AS c
ON b.PrefecturalID = c.PrefecturalID
GROUP BY
b.PrefecturalID
,c.CustomerID
) AS D
ON A.PrefecturalID = D.PrefecturalID
INNER JOIN
(
SELECT
f.CustomerID
,e.ProductID
,SUM(f.Quantity * e.Price) AS 販売合計金額
FROM
Products AS e
INNER JOIN
Sales AS f
ON e.ProductID = f.ProductID
GROUP BY
e.ProductID
,f.CustomerID
) AS G
ON D.CustomerID = G.CustomerID
INNER JOIN
Products AS I
ON
I.ProductID = G.ProductID
ORDER BY
A.PrefecturalID
,A.PrefecturalName
,I.ProductName
;

###補足情報

テーブル結合の仕方は他にもあるかと思いますが、今回はNameをGROUP BYしないようにコードを組みたいのでこのような形になっています。

出力項目:PrefecturalID、PrefecturalName、ProductName、販売合計金額
出力順:PrefecturalID、PrefecturalName、ProductName

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

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

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

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

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

guest

回答1

0

ベストアンサー

CustomerIDを結合したせいでGROUP BYがかからなくなっている

最初シンタックスエラーが出ているのかと思いましたが、どうやら顧客別に集計されてしまうのが外せないといった内容のようですね。
最小限の修正ですますなら、一番外でもう一度Groupすれば良いと思います。

sql

1SELECT A.PrefecturalID, A.PrefecturalName, I.ProductName, SUM(G.p) AS 販売合計金額 2FROM Prefecturals AS A 3INNER JOIN ( 4 SELECT b.PrefecturalID, c.CustomerID 5 FROM Prefecturals AS b 6 INNER JOIN Customers AS c ON b.PrefecturalID = c.PrefecturalID 7 GROUP BY b.PrefecturalID, c.CustomerID 8) AS D ON A.PrefecturalID = D.PrefecturalID 9INNER JOIN ( 10 SELECT f.CustomerID, e.ProductID, SUM(f.Quantity * e.Price) AS p 11 FROM Products AS e 12 INNER JOIN Sales AS f ON e.ProductID = f.ProductID 13 GROUP BY e.ProductID, f.CustomerID 14) AS G ON D.CustomerID = G.CustomerID 15INNER JOIN Products AS I ON I.ProductID = G.ProductID 16GROUP BY A.PrefecturalID, A.PrefecturalName, I.ProductName 17ORDER BY A.PrefecturalID, A.PrefecturalName, I.ProductName

ところでこのSQLはこのままでも動作するとは思うのですが、相当変かもしれません。
DBの中身が分からないのでなんともいえませんが、ひょっとしてこれでも同じ結果が得られるのでは?

sql

1SELECT 2 Base.PrefecturalID, PrefName.PrefecturalName 3 , ProdName.ProductName, Base.SumP AS 販売合計金額 4FROM ( 5 SELECT Pref.PrefecturalID, Prod.ProductID, SUM(Sale.Quantity * Prod.Price) AS SumP 6 FROM Prefecturals Pref 7 INNER JOIN Customers Cust ON Pref.PrefecturalID = Cust.PrefecturalID 8 INNER JOIN Sales Sale ON Cust.CustomerID = Sale.CustomerID 9 INNER JOIN Products Prod ON Sale.ProductID = Prod.ProductID 10 GROUP BY Pref.PrefecturalID, Prod.ProductID 11) Base 12INNER JOIN Prefecturals PrefName ON Base.PrefecturalID = PrefName.PrefecturalID 13INNER JOIN Products ProdName ON Base.ProductID = ProdName.ProductID 14ORDER BY Base.PrefecturalID, ProdName.ProductName

投稿2016/02/08 10:34

編集2016/02/08 10:41
hirohiro

総合スコア2068

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

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

yyy

2016/02/08 13:39

ありがとうございます! これでも同じ結果が得られるのでは…と書いていただいたコードですが、私もそう思います。 そして見た目にもわかりやすいと思うのです。 しかし、上司にnameをGROUP BYするなと指示されており…困っていたところだったのです。 (サーバーに負担がかかるとかなんとか…) わかりやすいご回答ありがとうございました!
hirohiro

2016/02/08 13:50

ありゃ、「これでも同じ~」は下側のSQLですが、nameはグループしてませんよ? GROUP BY Pref.PrefecturalID, Prod.ProductID これだけです。
yyy

2016/02/09 00:18 編集

すみません、ORDER BYの部分を見てしまっていました…。 試してみたところ、確かに同じ結果が得られました。 自分で作ったものはサブクエリを2つに分けていたのですが、それを1つに纏め、必要な要素をいっぺんに抽出するような感じでしょうか。 わざわざCustomerIDを別で抽出していたので、それに紐づいたPrefecturalIDがグループ化をするときに引っかかっていたのですね。
yyy

2016/02/09 02:16

以下、自分が使っているエイリアス名等たさせていただいたコードで完成しました。 SELECT Z.PrefecturalID ,Z.PrefecturalName ,Y.ProductName ,X.販売合計金額 FROM ( SELECT A.PrefecturalID ,D.ProductID ,SUM(D.Price*C.Quantity) AS 販売合計金額 FROM Prefecturals AS A INNER JOIN Customers AS B ON A.PrefecturalID = B.PrefecturalID INNER JOIN Sales AS C ON B.CustomerID = C.CustomerID INNER JOIN Products AS D ON C.ProductID = D.ProductID GROUP BY A.PrefecturalID ,D.ProductID ) AS X INNER JOIN Products AS Y ON X.ProductID = Y.ProductID INNER JOIN Prefecturals AS Z ON X.PrefecturalID = Z.PrefecturalID ORDER BY Z.PrefecturalID ,Z.PrefecturalName ,Y.ProductName ; つまっていたことが理解できました。hirohiroさん、本当にありがとうございました。
hirohiro

2016/02/09 15:10 編集

解決したようでよかったです。 はじめに書かれていたSQLのサブクエリDは、県&企業の組が一意ではない場合は必要です。しかし、各テーブルの機能から考えて、同じ県に同じ企業(ID)が複数あるとは考えられません。(名前が同じとか、子会社などはありえますがIDは異なっているはずです。)だから普通はCustomersテーブルは「PrefecturalID,CustomerID」の組がユニークになるように制約を設定しているはずです。 (これがされていないとデータが変になる可能性が出てくるので良くないです。) ということで、もともとユニークな「PrefecturalID,CustomerID」の組をDistinctしようとしているサブクエリDは最初から不要だったということになります。 Salesにも同じ企業(ID)へのおなじ売り上げ(ID)が二重に記録されるはずも無く Productsにも同じ製品(ID)が複数登録されているはずもない ので、それぞれDistinctしようとするコードは不要な場合が多いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問