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個の売上明細が部品行の数だけ集計されてしまいます。
・・・とまぁこのような感じで困っています。
面倒くさい質問ではありますが、どうぞよろしくお願いします。
とりあえず見える範囲で考えてみますと
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側での処理を併用することによって、さらなる高速化を期待できたりはします。
とりあえず見える範囲で考えてみますと
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しようとすると売上明細の金額が重複されて集計されてしまいます。
まだやってはないですが、このクエリだと同じような結果になりそうな気がするのですが、どうでしょうか?とりあえず取り掛かります。
追記:やってみましたが、やはり部品行分集計されてしまいました。
そうすると、部品行数で割ってやればいんですかね。
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 原価
ここの部分を削除すると売上高がちゃんと集計されるのですが、この部品単価を集計するところでエラーになります。
もう少し頑張ってみます。
コメントありがとうございます。
売上明細と製品が「1対1」、製品と部品構成表が「1対多」で繋がっているため、これを一気にSUMしようとすると売上明細の金額が重複されて集計されてしまいます。
まだやってはないですが、このクエリだと同じような結果になりそうな気がするのですが、どうでしょうか?とりあえず取り掛かります。
追記:やってみましたが、やはり部品行分集計されてしまいました。
そうすると、部品行数で割ってやればいんですかね。