毎回お世話になっており大変助かっています。
今回はグループ集計クエリについてです。製品用の①部品構成テーブル(構成ID、製品ID、部品ID、員数、単価)と②組立構成テーブル(組立ID、製品ID、実装項目ID、実装費)があります。
テーブルの入力分としては下記の様になります(組立構成テーブルも同様)
・構成ID:1
・製品ID:20
・部品ID:3
・員数:4
・単価:20円
・構成ID:2
・製品ID:20
・部品ID:10
・員数:1
・単価:10円
①を基にしたQ部品構成F_Sub用RSと②を基にしたQ組立構成F_Sub用RSの各クエリがあります。その2つを製品IDでクエリ上でリレーション
して製品ID毎の部品代合計・実装費合計を出したいのですが合計金額が上手くいきません。クエリのSQLは下記です(小計は部品の員数×単価。クエリの自動作成SQLそのままです)。
SELECT Q部品構成F_Sub用RS.製品ID, Sum(Q部品構成F_Sub用RS.小計) AS 小計の合計, Sum(Q組立構成F_Sub用RS.実装費) AS 実装費の合計
FROM Q部品構成F_Sub用RS INNER JOIN Q組立構成F_Sub用RS ON Q部品構成F_Sub用RS.製品ID = Q組立構成F_Sub用RS.製品ID
GROUP BY Q部品構成F_Sub用RS.製品ID;
よく見ると例えば製品IDが700のものは構成IDが5ヶあり(5種の部品使う形)、組立IDが1ヶ(1種の実装項目の形)の場合
実装費の合計が正しい値の5倍(構成IDの数)となってます。クエリ上でテーブルを一つにすると正しい金額になります。
1つずつのテーブルでクエリを2つ作成してそれを更に別クエリで製品IDのリレーションしてするしか無理でしょうか?
宜しくお願いします。
部品構成、組立構成の両クエリとも、製品IDが一意になっていないため
多:多の結合になり、行割れが発生しているのでしょう
こういった場合は、クエリ同士を
横並びに結合するのではなく、縦に結合することでご希望の結果になります
mayuさん ありがとうございます。コピーしたら上手く出来ました。確かに異なるテーブル同士なのでユニオンでなければ不可能ですね。素晴らしいSQLです! サブクエリにユニオン使うなんてとても自分では思いつきません。
この形にしないと1つのクエリでは出来ないのですよね? すみませんテクニックについていけてなくて。
ユニオンクエリを使う場合は仰るとおりです
JOINで実装する場合は
結合キーである製品IDが、2つのクエリで どのような関係性にあるか
が成否(表内の〇と×)の要因となります
今回のご質問では、SQ文で利用されている2つのクエリに対し
行を一意にするキー項目の判別ができなかったこともあり
データの性質次第では、SQLの結果セットで 行の欠損が発生したり 誤った集計結果が出る
という現象を回避できる
ユニオン(縦結合)の回答が適切と判断しました
mayuさん分かり易い解説ありがとうございます。
リレーションしているからと言ってもどんなデータの関係になっているかですね。大変参考になりました。
お世話になりました。