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

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

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

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

Q&A

解決済

2回答

1714閲覧

GROUP BYと副照会の共存について

hood

総合スコア351

SQL

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

0グッド

0クリップ

投稿2018/11/14 09:51

###GROUP BYと副照会の共存について
学校の課題でわからないところがあり、投稿させていただきました。
特に副照会とGROUP BYの共存の仕方についてです。

まず、課題というのは「大阪商会が発注した商品と同じ商品を発注したことのある顧客の顧客名とその住所のリストを返すSQLコマンドを作成せよ。ただし、同じ企業名が重複して表示されないようにすること」というものです。(課題で使う、データベースについては下に画像として張っておきます。少し見にくいかもしれませんが、)

僕はこの課題を攻略するため、
① 顧客表と受注明細表を結合

②顧客表の大阪商会という行を選ぶ。

③そこから受注明細表の商品番号(つまり、大阪商会が買った商品番号)を取得

④副照会を使い、③の商品番号と、受注明細表の商品番号をつきあわせる(大阪商会の買った商品を買った顧客番号を得るため)

⑤かぶっている顧客名をGROUP BYでまとめる

⑥顧客表と受注明細表を結合

⑦④の顧客番号を見て、顧客表から顧客名を割り出す。
という道筋を立てました。

しかし、題目にも書いた通り⑤の部分、「かぶっている顧客名をGROUP BYでまとめる」ことができませんでした。
というのも、GROUP BYをどこに書いたとしてもエラーとなってしまうからです。
以下は⑤を抜いたコードです。

SQL

1SELECT KOKYAKUMEI          7 2FROM KOKYAKU X ,JMEISAI Y 3WHERE X.KOKYAKUNO=Y.KOKYAKUNO   6 4AND Y.SHOHINNO IN(         4 5SELECT SHOHINNO           3 6FROM KOKYAKU X,JMEISAI Y 7WHERE X.KOKYAKUNO=Y.KOKYAKUNO   1 8AND X.KOKYAKUMEI='大阪商会' 2 9) 10 11・・・ 12GROUP BY KOKYAKUMEI        5 13・・・どこに書いてもエラー        

このコードの結果は狙い通り、上手くでました。

東京商事 東京商事 大阪商会 大阪商会 西中国商店

あとはこれをまとめればいいだけなのですが、その一線がどうしても超えられません。
つまり、GROUP BYと副照会の共存についてできません。
私の考えた方のどこが間違っているのか・・・?
どうかご教授おねがします!!!

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

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

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

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

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

yambejp

2018/11/14 10:16

create tableとinsert intoでテーブルサンプルを文字起こししてください
hood

2018/11/14 10:48

ご指摘ありがとうございます。やはり、文字起こしは礼儀ですよね・・・今回は回答がついたのですが、また今度質問する機会があれば、そのようにしたいと思います・・・申し訳ありませんでした・・・
guest

回答2

0

シンプルに。

SQL

1SELECT DISTINCT 2 KOKYAKUMEI 3FROM KOKYAKU X ,JMEISAI Y 4WHERE X.KOKYAKUNO = Y.KOKYAKUNO 5AND X.KOKYAKUMEI = '大阪商会'

or

SQL

1SELECT DISTINCT 2 KOKYAKUMEI 3FROM KOKYAKU X ,JMEISAI Y 4WHERE X.KOKYAKUNO = Y.KOKYAKUNO 5AND X.KOKYAKUMEI IN('東京商事','大阪商会', '西中国商店')

じゃダメなの?

同じSQLでもデータベースによって方言が大きいですから、どのデータベースを使うのかを質問のタグで明示したり、バージョンも明記した方が適切なコメントが付き易いです。 SQLの観点から Oracle Database, PostgreSQL, MySQL の特徴を整理しよう!

投稿2018/11/14 11:47

Orlofsky

総合スコア16415

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

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

sazi

2018/11/14 12:19

注文された商品を経由してないから、駄目でしょう。
Orlofsky

2018/11/14 12:54

受注明細表を使っているから大丈夫かと思いました。
hood

2018/11/18 09:14

遅くなって申し訳ありません。回答ありがとうございます。 やはり、大阪商会の商品番号から参照させたいので、saziさんに教わった方法をとりたいと思います・・・ 方言が大きいことなど、教えてくださり、ありがとうございました・・・
guest

0

ベストアンサー

「大阪商会が発注した商品と同じ商品を発注したことのある顧客の顧客名とその住所のリストを返すSQLコマンドを作成せよ。ただし、同じ企業名が重複して表示されないようにすること」

求めたい結果は、「顧客名とその住所のリスト
その結果に対する条件は、「大阪商会が発注した商品と同じ商品を発注したことのある顧客
「ただし、同じ企業名が重複して表示されないようにすること」については、「顧客名とその住所のリスト」という性質上あり得ないことなので、課題としての注釈ですね。

テーブルの構成を見ると、顧客表に対して「顧客番号」条件にする必要があることは分かる。
じゃあ、条件として「大阪商会が発注した商品と同じ商品を発注したことのある顧客」の問い合わせ結果を条件にすればいい事に。
大阪照会が注文した商品を求めるには顧客番号と商品番号が分かればいいので、受注明細表で事足りる。
その商品を注文している顧客は逆のパターンで受注明細表で求められる。

SQL

1SELECT * FROM KOKYAKU 2WHERE KOKYAKUNO in ( 3 select KOKYAKUNO from JMEISAI 4 where SHOHINNO in (select SHOHINNO from JMEISAI where KOKYAKUNO='D010') 5 )

結合すると件数が増えるけど、結合して取得する項目ではないので、単に条件としてin を使用すれば、group by は不要ですね。
リストには大阪商会も含まれるので、大阪商会以外のリストなら条件を追加。

投稿2018/11/14 10:18

編集2018/11/14 11:06
sazi

総合スコア25173

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

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

hood

2018/11/14 10:46

回答ありがとうございます。 ご教授いただいたコード、試してみたら上手くいきました。 なるほど・・・受注明細表で大阪商会を絞り込めばよかったのですね・・・ 端的かつ論理的な答え・・・脱帽の二文字です。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問