dポイントプレゼントキャンペーン実施中!

SQLで合計・総合計を出してたいのですが、どうしたらいいのですか?
教えてください

下記はこのような感じでデータベースがあった場合です



得意先:T_得意先.得意先番号
得意先名称:T_取引先.得意先名称
T_受注.工場番号 = T_取引先.取引先番号


T_受注.品目番号
T_受注.品目名
T_区分明細.区分明細名
T_受注.受注番号
T_受注.受注日
T_受注.納期
T_受注.受注数
T_受注.単位名
T_受注.単価 
T_受注.仮単価区分 
T_受注.金額 
T_担当者.担当者名

--番号で名称を結合
品目名 = (T_品目.品目番号 = T_受注.品目番号)
単位名 = (T_単位.単位番号 = T_受注.単位番号)
担当者名 = (T_担当者.担当者番号 = T_受注.担当者番号)
--------------------


得意先合計:得意先ごとの「金額」合計

総合計:全得意先の「金額」合計

A 回答 (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文」を示していただいた方がよいと思います。

この回答への補足

ごめんなさい。
足らなくて

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.00000000 36.000000000 佐藤
1 1 北海道  K2 いす 12 2008-09-03 00:00:00.000 2008-10-06 00:00:00.000 3.000個 13.00000000 39.000000000 佐藤
2 2 沖縄  K3 電車 13 2008-09-03 00:00:00.000 2008-10-06 00:00:00.000 3.000式 14.00000000 42.000000000  高橋
   
得意先合計  75.000000000
総合計   117.000000000

補足日時:2008/12/01 20:50
    • good
    • 0

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_受注.品目名という書き方は誤りだということです。クエリの方あっていることが確認できましたから、いいのですが。
    • good
    • 0

・基本構文をおさえたあとは、「すべての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初心者なんで、すみませんが、お願いします

補足日時:2008/11/30 16:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す