人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQL(MySQL5)の質問です。
SQLの書き方についてアドバイスを頂けると助かります。

売上[1] - [*]売上明細[1]-[1]製品[1]-[*]部品構成表[1]-[1]部品

このように繋がっているテーブルがあるとして、1回のクエリで売上、原価を集計することは出来るでしょうか?

売上ID|売上明細ID|製品ID|名前 |売上(明細を集計)|原価(部品単価を集計)
1 |1 |1 |HOGE|100|50
1 |2 |2 |GEHO|200|100
1 |3 |3 |AHO |300|100

製品IDをキーに原価を集計するところ(上記)までは出来たのですが、これをさらに売上IDをキーに集計したいのです。原価についてはうまく集計されるのですが、売上についてはうまく集計できません。

売上[1] - [*]明細(製品)[1] - [*]部品

こんな感じで、1つの製品(売上明細)に複数の部品行が付いているために集計(GROUP BY 売上ID)しようとすると1個の売上明細が部品行の数だけ集計されてしまいます。

・・・とまぁこのような感じで困っています。
面倒くさい質問ではありますが、どうぞよろしくお願いします。


●質問者: southgate_01
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:GROUP hoge SQL アドバイス キー
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● kn1967
●250ポイント ベストアンサー

とりあえず見える範囲で考えてみますと

SELECT T1.売上ID,sum(T2.売上) AS 売上集計,sum(T4.単価) AS 部品単価集計
FROM (((売上 AS T1
 LEFT JOIN 売上明細 AS T2 ON T2.売上ID = T1.売上ID)
 LEFT JOIN 部品構成表 AS T3 ON T3.製品ID = T2.製品ID)
 LEFT JOIN 部品 AS T4 ON T4.部品ID = T3.部品ID
GROUP BY T1.売上ID;

それぞれのテーブルがもつカラムの名称が一部不明だったりするので

SQLを投げてもらうほうが楽で正確かと思いますよ。


10万件もの処理となればパフォーマンスMySQLの圧勝だと思いますが

適宜php側での処理を併用することによって、さらなる高速化を期待できたりはします。

◎質問者からの返答

コメントありがとうございます。


売上明細と製品が「1対1」、製品と部品構成表が「1対多」で繋がっているため、これを一気にSUMしようとすると売上明細の金額が重複されて集計されてしまいます。


まだやってはないですが、このクエリだと同じような結果になりそうな気がするのですが、どうでしょうか?とりあえず取り掛かります。


追記:やってみましたが、やはり部品行分集計されてしまいました。

そうすると、部品行数で割ってやればいんですかね。


2 ● b-wind
●50ポイント
SELECT
 製品.ID,売上.ID,SUM(売上明細.金額) AS 売上,
 SUM(
 SELECT 部品.単価 * 部品構成表.数量 * 明細集計.数量
 FROM
 売上明細 AS 明細集計
 LEFT JOIN
 部品構成表 ON 明細集計.製品ID = 部品構成表.製品ID
 LEFT JOIN
 部品 ON 部品構成表.部品ID = 部品.ID
 WHERE
 売上明細.ID = 明細集計.ID
 ) AS 原価
FROM
 売上
 LEFT JOIN
 売上明細 ON 売上.ID = 売上明細.売上ID
 LEFT JOIN
 製品 ON 売上明細.製品ID = 製品.ID
GROUP BY 製品.ID,売上.ID

こんなとこ?

◎質問者からの返答

ありがとうございます。

どうしてもシンタックスエラーになってしまいます。


SUM(

SELECT 部品.単価 * 部品構成表.数量 * 明細集計.数量

FROM

売上明細 AS 明細集計

LEFT JOIN

部品構成表 ON 明細集計.製品ID = 部品構成表.製品ID

LEFT JOIN

部品 ON 部品構成表.部品ID = 部品.ID

WHERE

売上明細.ID = 明細集計.ID

) AS 原価


ここの部分を削除すると売上高がちゃんと集計されるのですが、この部品単価を集計するところでエラーになります。


もう少し頑張ってみます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ