- ベストアンサー
SQLで合計表示する方法
- SQLを使用して、データベース内の合計と総合計を表示する方法を教えてください。
- データベース内の各得意先ごとに金額の合計を表示する方法を教えてください。
- 全得意先の金額の総合計を表示する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず書く前に自分の書いたものを見直すことをお勧めします。 a) >品目名 → T_受注.品目番号 = T_品目.品目番号 と結合 >単位名 → T_単位.単位番号 = T_受注.単位番号 と結合 >で該当であっていました 以下が質問者さんが最初に書かれたレイアウトです。 T_受注.品目番号 T_受注.品目名 T_区分明細.区分明細名 T_受注.受注番号 T_受注.受注日 T_受注.納期 T_受注.受注数 T_受注.単位名 T_受注.単価 T_受注.仮単価区分 T_受注.金額 T_担当者.担当者名 結合条件はさすがに推測できましたが、結合している目的を考えてください。 T_受注.単位名 T_受注.品目名 は本当に合っていますか?合っていれば結合する必要がありませんよね。 b) 以下が質問者さんが最初に書かれた条件です。 得意先:T_得意先.得意先番号 得意先名称:T_取引先.得意先名称 T_受注.工場番号 = T_取引先.取引先番号 >T_取引先.得意先番号 >T_取引先.取引先名称 は T_受注.得意先番号 = T_取引先.得意先番号で >同じ得意先番号で表示させます >取引先番号ではなく得意先番号 >工場番号※ T_取引先参照 取引先名称表示 これが本当だとすると、T_得意先というマスタはなく、T_取引先のレイアウトは T_取引先(取引先番号、得意先番号、取引先名称) で、しかも取引先番号、得意先番号ともに一意制約(=ユニーク制約) がついていることになりますが、それで合っていますか? c) >>羅列してある項目の中に「得意先」に関する情報が一切ないように見えます。 >>それでどうやって「得意先ごとの金額合計」の結果がそれぞれどの得意先のものか判断しますか? この質問の意味が理解されていないようです。 最初に質問者さんの書いた戻り値のレイアウトには、得意先番号も取引先名称も含まれていません。 得意先別合計に表示できるのは、金額だけになってしまいます。 複数の得意先が含まれていた場合には、どの行がどの得意先のものかわからなくなってしまいます。 だから、レイアウトを見直すべきではないですか、と言いたかったのですが。 d) >あとこのデータはVB.NETで工場番号を入力してSQLで呼び出します ここまで書いても使っているデータベースが何かが出てきませんね。 前回書いたサンプルを読み解けず、定義も十分に示せないとすれば、質問者さんが合計や総合計は抜きにして、「今明細が正しく取得できているSQL文」を示していただいた方がよいと思います。
その他の回答 (2)
- jamshid6
- ベストアンサー率88% (591/669)
a)「・T_M_区分明細区分明細名をT_区分.区分番号を'01'を表示」というのが純粋に日本語として理解できないです。 T_区分.区分番号='01'の場合だけデータを抽出したいのですか? T_区分.区分番号='01'の場合だけT_区分明細.区分明細名を表示したいのですか? それから、T_区分明細、T_区分およびT_受注残のJOINキーをおしえてください。 b)3つのSELECT文は項目の数が同じになるようにNULLの数を調整してください。 (UNION ALLは3つのSELECT文を単につないでいるだけです) c)T_受注残.得意先番号とT_取引先.得意先番号と両方SELECTする必要はありません。両者は必ず同じ値ですから、どちらか1つだけにすべきです。 d)最後のGROUP BY 工場番号は不要です。 e)「工場番号を貢献する(order by 工場番号)」は、前に書かれた「あとこのデータはVB.NETで工場番号を入力してSQLで呼び出します」というのと矛盾しています。 工場番号を指定してSQLを実行するわけですから、工場番号は1つに絞られるのではないですか? (ちなみに) >T_受注.単位名、T_受注.品目名 これは確認しましたが、本当にあっていました。 クエリにはT_受注.単位名、T_受注.品目名ではなく、T_単位.単位名,T_品目.品目名って書いていますよね。 T_受注というテーブルには単位名も品目名も存在しないので、T_受注.単位名、T_受注.品目名という書き方は誤りだということです。クエリの方あっていることが確認できましたから、いいのですが。
- jamshid6
- ベストアンサー率88% (591/669)
・基本構文をおさえたあとは、「すべてのDBMSで動くSQL文」という考え方が難しくなってきます。したがって、そのSQLを実行しようとしているデータベースの種類は明記すべきです。 そうでないと、情報処理技術者試験のように標準SQLでサポートされている機能のみしか回答がつけられません。 (ROLLUPなどを使えるケースでもサポートしているDBMSが限られるのでそれを使った回答はできなくなります) ・質問をアップするときに、以下の点に留意ください。 a)書かれている項目のリストがSELECT文の戻り項目なのでしょうが、間違っていませんか?(T_受注.品目名、T_受注.単位名はT_品目.品目名、T_単位.単位名であるべきですよね) b)羅列してある項目の中に「得意先」に関する情報が一切ないように見えます。それでどうやって「得意先ごとの金額合計」の結果がそれぞれどの得意先のものか判断しますか? 上にあるb)のため、明細と合計、総合計を一緒に表示できないので、 項目にはT_取引先.取引先番号,T_取引先.得意先名称も追加し、 明細・得意先別合計・総合計をまとめて表示するためにデータ区分の項目も追加した例を示します。 そのまま使えるとは思いませんが、ポイントは理解できると思います。 SELECT 1 区分, T_取引先.取引先番号, T_取引先.得意先名称, T_受注.品目番号, T_品目.品目名, T_区分明細.区分明細名, T_受注.受注番号, T_受注.受注日, T_受注.納期, T_受注.受注数, T_単位.単位名, T_受注.単価, T_受注.仮単価区分, T_受注.金額, T_担当者.担当者名 FROM T_受注 INNER JOIN T_品目 ON T_品目.品目番号 = T_受注.品目番号 INNER JOIN T_単位 ON T_単位.単位番号 = T_受注.単位番号 INNER JOIN T_担当者 ON T_担当者.担当者番号 = T_受注.担当者番号 INNER JOIN T_取引先 ON T_取引先.取引先番号=T_受注.工場番号 UNION ALL SELECT 2 区分, T_取引先.取引先番号, T_取引先.得意先名称, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, SUM(T_受注.金額),NULL FROM T_受注 INNER JOIN T_取引先 ON T_取引先.取引先番号=T_受注.工場番号 GROUP BY T_取引先.取引先番号,T_取引先.得意先名称 UNION ALL SELECT 3 区分, NULL,'総合計', NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, SUM(T_受注.金額),NULL FROM T_受注 ORDER BY 1
補足
a)書かれている項目のリストがSELECT文の戻り項目なのでしょうが、間違っていませんか?(T_受注.品目名、T_受注.単位名はT_品目.品目名、T_単位.単位名であるべきですよね) これらは調べてみましたが、 品目名 → T_受注.品目番号 = T_品目.品目番号 と結合 単位名 → T_単位.単位番号 = T_受注.単位番号 と結合 データ表示 で該当であっていました b)羅列してある項目の中に「得意先」に関する情報が一切ないように見えます。それでどうやって「得意先ごとの金額合計」の結果がそれぞれどの得意先のものか判断しますか? T_取引先.得意先番号 T_取引先.取引先名称 は T_受注.得意先番号 = T_取引先.得意先番号で同じ得意先番号で表示させます 取引先番号ではなく得意先番号 工場番号※ T_取引先参照 取引先名称表示 なお、かいたリストにT_区分明細.区分明細名はT_区分.区分番号 = '01'で表示します T_受注.工場番号 ,T_取引先.得意先番号で番号が一致するデータを呼びます あとこのデータはVB.NETで工場番号を入力してSQLで呼び出します 記入漏れがあったのですみませんが、またよろしくお願いします 作成していただいたSQLは参考にしてやってみましたが、思うようにいきません なにぶんSQL初心者なんで、すみませんが、お願いします
補足
ごめんなさい。 足らなくて a)T_受注.単位名 T_受注.品目名 これは確認しましたが、本当にあっていました 品目名 → T_受注.品目番号 = T_品目.品目番号 と結合 >単位名 → T_単位.単位番号 = T_受注.単位番号 と結合 b)T_得意先というマスタはなく、T_取引先のレイアウトは T_取引先(取引先番号、得意先番号、取引先名称) で、しかも取引先番号、得意先番号ともに一意制約(=ユニーク制約) がついていることになりますが、それで合っていますか? 回答:確認しましたが、合っています <捕捉> ・得意先合計(受注数 * 単価)得意先毎の金額合計 ・総合計(金額)算得意先の金額合計 ・T_M_区分明細区分明細名をT_区分.区分番号を'01'を表示 ・工場番号を貢献する(order by 工場番号) データベース:Microsoft SQL Server Management Studio Express 今、作成中のSQL SELECT T_受注残.得意先番号, T_取引先.得意先番号, T_取引先.取引先略名, T_受注残.品目番号, T_品目.品目名, --T_区分明細.区分明細名, T_受注残.受注番号, T_受注残.受注日, T_受注残.納期, T_受注残.受注数, T_単位.単位名, T_受注残.単価, T_受注残.仮単価区分, T_受注残.金額, T_担当者.担当者名 FROM T_受注残 INNER JOIN T_品目 ON T_品目.品目番号 = T_受注残.品目番号 INNER JOIN T_単位 ON T_単位.単位番号 = T_受注残.単位番号 INNER JOIN T_担当者 ON T_担当者.担当者番号 = T_受注残.売上担当者 INNER JOIN T_取引先 ON T_取引先.得意先番号=T_受注残.得意先番号 UNION ALL SELECT T_取引先.得意先番号, T_取引先.取引先略名, --T_受注残.得意先番号, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, SUM(T_受注残.単価 * T_受注残.受注数) as 得意先合計,NULL FROM T_受注残 INNER JOIN T_取引先 ON T_取引先.得意先番号=T_受注残.得意先番号 GROUP BY T_取引先.得意先番号,T_取引先.取引先略名,T_受注残.得意先番号 UNION ALL SELECT NULL,'総合計', NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, SUM(T_受注残.金額),NULL FROM T_受注残 GROUP BY 工場番号 得意先番号 得意先番号 取引先名称 品目番号 品目名 受注番号 受注日 納期 受注数 単位 単価 仮単価区分 金額 担当者名 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 1 北海道 K1 机 11 2008-09-03 00:00:00.000 2008-10-06 00:00:00.000 3.000 個 12.000000 00 36.000000000 佐藤 1 1 北海道 K2 いす 12 2008-09-03 00:00:00.000 2008-10-06 00:00:00.000 3.000 個 13.000000 00 39.000000000 佐藤 2 2 沖縄 K3 電車 13 2008-09-03 00:00:00.000 2008-10-06 00:00:00.000 3.000 式 14.000000 00 42.000000000 高橋 得意先合計 75.000000000 総合計 117.000000000