![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
GROUP BYの記述方法について教えてください
---------------------
受注データ(テーブル)
---------------------
品目CD 受注数
00001 10
00001 10
00002 20
00002 15
---------------------
品目マスタ(テーブル)
---------------------
品目CD 品目名
00001 えんぴつ
00002 けしごむ
00003 色鉛筆
上記二つのDBから、品目ごとの受注数の合計を取得するときのSQL文として、どうするのが正しいのでしょうか?
---------------------
欲しい結果
---------------------
品目CD 品目名 受注数
00001 えんぴつ 20
00002 けしごむ 35
(考えられるSQL)
CASE1:受注データの品目CDと品目マスタの品目名のグループ化
SELECT A.品目CD, B.品目名, SUM(A.受注数)
FROM 受注データ A, 品目マスタ B
WHERE A.品目CD = B.品目CD
GROUP BY A.品目CD, B.品目名
CASE2:受注データをグループ化した結果と品目マスタを結合
SELECT X.品目CD, X.受注数合計, Y.品目名
FROM
(SELECT 品目CD, SUM(受注数)
FROM 受注データ
GROUP BY 品目CD)X,品目マスタ Y
WHERE X.品目CD = Y.品目CD
CASE3:品目マスタの品目CDと品目名のグループ化
SELECT B.品目CD, B.品目名, SUM(A.受注数)
FROM 受注データ A, 品目マスタ B
WHERE A.品目CD = B.品目CD
GROUP BY B.品目CD, B.品目名
レスポンスも含めて教えてください。
よろしく、お願いします。
No.3ベストアンサー
- 回答日時:
#1です。
蛇足以外のなにものでもないんですけど、追加質問に対してコメントしておきます。実行上のレスポンスは全く変わらないです。
CASE1のクエリを書く人は実際は多いと思います。それはこのクエリのメインの目的は受注数を出すことであって、商品名を出すことではないからです。
例のクエリがシンプルですから、頭の中で全部組み上げて一気にかけますが、もっと複雑なクエリになってくると、本当に必要な数字が取れることを確認してから付随情報を付加していくように書くと思います。
つまり、まず
SELECT A.品目CD, SUM(A.受注数)
FROM 受注データ A
GROUP BY A.品目CD
というクエリを書いて想定される数字が出せるかどうか確認し、
それから
SELECT A.品目CD, B.品目名, SUM(A.受注数)
FROM 受注データ A
INNER JOIN 品目マスタ B ON B.品目CD=A.品目CD
GROUP BY A.品目CD,B.品目名
と書き足します。
したがって、CASE1のメリットをあげるとすれば、「書きやすい」ことでしょうか。
ここまで来ると個人的な意見にすぎませんけどね。
No.2
- 回答日時:
既に#1さんが丁寧な回答をされていますが
自分で複数のアプローチのSQLを考えることができて
レスポンスについても気にしている段階にいるのであれば
実行計画の読み方について勉強すれば良いと思います。
オラクル固有の表現もありますが、他のDBMSを使用するにあたっても
基本的な表示やロジックは同じですので得た知識を流用できます。
#既に実行計画が読めるのであれば実行計画も添付すると回答がしやすくなります。
No.1
- 回答日時:
まあ、一つの意見として見てください。
1つ目の見方は、「どのやり方も正しい」です。
後述しますが、どの書き方をしてもレスポンスに大きな差は生じません。また、どの書き方をしても実務上「その書き方は間違っている」と怒られることもないはずです。
2つ目の見方は、「CASE3の書き方が最もメンテナンスしやすい」です。
今回は条件が全くない例ですが、たとえば、「対象を絞りたい」、「受注がなくてもすべての商品を出したい」、「受注数合計だけでなく、最大の受注数も出したい」などの追加要望があったときに、最も簡単に対応できるのはCASE3です。
まあ、これも大した手間の差ではないですけどね。
3つ目の見方は、「CASE2の書き方が状況次第では一番レスポンスがいい」です。先にグループするとJOINする件数が減るので、コストが下がります。基本的にはレスポンスのいい書き方といえます。
(商品を絞るときでも受注数のサブクエリに条件を追加することになるので、メンテナンス性はあまりよくないです)
ただ、状況次第と書いた理由は、以下の通りです。
・もし受注データが少ない場合は、このコストの差は極めて少ないので、体感できるほどのレスポンスの差はでないでしょう。
・もし受注データが非常に多い場合、Oracleのオプティマイザがどの書き方をしても、Case2の実行プランが一番早いと判断して、Case2のクエリに書き換えて実行するでしょう。
(オプティマイザはどのDBMSにもあるし、バージョンによって動きは違いますが、おそらく)
ということで、結局どの書き方でも私は問題ないという意見です。
返信ありがとうございます。
詳しく記述いただきありがとうございます。
CASE1については、特に記述がなかったのですが、CASE3と同じとみてもいいのでしょうか?それとも多少なりともなにか変わるのでしょうか?教えてください
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) accessでの請求管理について 2 2022/06/13 21:51
- Excel(エクセル) VBA でvlookup エラーなどは削除したい 8 2022/12/30 04:03
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- SQL Server SQLのクエリの書き方 1 2022/03/29 23:06
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- Visual Basic(VBA) 重複データをまとめて合計を合算する 4 2022/10/25 20:25
- ネットスーパー 皆さんはネットショップで 10 2022/10/01 13:36
- Excel(エクセル) 【条件付き書式】countifsで複数条件を満たしたセルを赤くする方法 2 2023/02/09 23:53
- 会社・職場 ツルハで働いてる方に質問です。 特売品目表で特売発注する時に対象品目以外のは発注しないですか? 1 2023/04/19 00:49
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL文 2つのテーブルから、グ...
-
♪Oracle SQL 処理が成功した時...
-
Accessで複数テーブルのJoin
-
項目名の制限について
-
MySQLで改行を含む文の登録のし...
-
Excel 2019 のピボットテーブル...
-
IT用語について質問です。 以前...
-
エクセルVBAで5行目からオート...
-
Excelの表、重複データ2行を1...
-
アンドロイド おサイフケータイ...
-
Accessでテーブルからテーブル...
-
1ヶ月に土日は何日あるか
-
VBA 得意先ごと且つ日付ごとに...
-
顧客・売上管理のツールをさが...
-
アクセスのテーブルを分ける理...
-
アクセス・クエリ内のフィール...
-
Accessにて検索結果の一覧表示...
-
「直需」の意味を教えてください
-
Accessでコードを入れると名前...
-
Accessのフィールド数が255しか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
項目名の制限について
-
MySQLで改行を含む文の登録のし...
-
SQLでグループ化した結果の件数...
-
オラクルSQLの累計値取得方法に...
-
ORA-01722: 数値が無効です
-
SQL文 2つのテーブルから、グ...
-
列名無効について
-
フォームで検索 エラーの表示...
-
改行コードを削除して取得する...
-
3つのテーブルの結合
-
Accessで期間指定の売上合計と...
-
各店舗毎の最大売上の項目を取...
-
インサート文での条件の指定に...
-
GROUP BYの記述方法について
-
SQL文のエラーについて
-
SQL抽出方法に悩んでいます。 S...
-
AccessVBA コードをスキップし...
-
UPDATE文を教えて頂けな...
-
データベースから抽出した一覧...
-
Oracleでテーブルの結合について
おすすめ情報