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

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

ただいまの
回答率

88.59%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 782

hood

score 341

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

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

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

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

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

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

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

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

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

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

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

SELECT KOKYAKUMEI          7
FROM KOKYAKU X ,JMEISAI Y
WHERE X.KOKYAKUNO=Y.KOKYAKUNO   6
AND Y.SHOHINNO IN(         4
SELECT SHOHINNO           3
FROM KOKYAKU X,JMEISAI Y
WHERE X.KOKYAKUNO=Y.KOKYAKUNO   1
AND X.KOKYAKUMEI='大阪商会'        2
)

・・・
GROUP BY KOKYAKUMEI        5
・・・どこに書いてもエラー        


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

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


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yambejp

    2018/11/14 19:16

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

    キャンセル

  • hood

    2018/11/14 19:48

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

    キャンセル

回答 2

checkベストアンサー

0

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

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

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

SELECT * FROM KOKYAKU 
WHERE KOKYAKUNO in (
        select KOKYAKUNO from JMEISAI
        where SHOHINNO in (select SHOHINNO from JMEISAI where KOKYAKUNO='D010')
      )


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/14 19:46

    回答ありがとうございます。
    ご教授いただいたコード、試してみたら上手くいきました。

    なるほど・・・受注明細表で大阪商会を絞り込めばよかったのですね・・・
    端的かつ論理的な答え・・・脱帽の二文字です。
    本当にありがとうございました!

    キャンセル

0

シンプルに。

SELECT DISTINCT
    KOKYAKUMEI
FROM KOKYAKU X ,JMEISAI Y
WHERE X.KOKYAKUNO = Y.KOKYAKUNO
AND X.KOKYAKUMEI = '大阪商会'


or

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


じゃダメなの?

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/14 21:19

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

    キャンセル

  • 2018/11/14 21:54

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

    キャンセル

  • 2018/11/18 18:14

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

    キャンセル

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る