Microsoft Access 掲示板

グループ集計クエリについて

4 コメント
views
4 フォロー

毎回お世話になっており大変助かっています。
今回はグループ集計クエリについてです。製品用の①部品構成テーブル(構成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のリレーションしてするしか無理でしょうか?
宜しくお願いします。

beginner
作成: 2024/10/10 (木) 09:55:13
通報 ...
1

実装費の合計が正しい値の5倍(構成IDの数)となってます

部品構成、組立構成の両クエリとも、製品IDが一意になっていないため
多:多の結合になり、行割れが発生しているのでしょう

こういった場合は、クエリ同士を
横並びに結合するのではなく、縦に結合することでご希望の結果になります

SELECT 製品ID
     , Sum( 小計 ) As 小計の合計
     , Sum( 実装費 ) As 実装費の合計
FROM 
(
    SELECT 製品ID
         , 小計
         , CCur(0) As 実装費
    FROM Q部品構成F_Sub用RS
    UNION ALL
    SELECT 製品ID
         , 0
         , 実装費
    FROM Q組立構成F_Sub用RS
) q
GROUP BY 製品ID
;
2
beginner 2024/10/10 (木) 15:41:41 ddfe5@dbc09

mayuさん ありがとうございます。コピーしたら上手く出来ました。確かに異なるテーブル同士なのでユニオンでなければ不可能ですね。素晴らしいSQLです! サブクエリにユニオン使うなんてとても自分では思いつきません。
この形にしないと1つのクエリでは出来ないのですよね? すみませんテクニックについていけてなくて。

3

この形にしないと1つのクエリでは出来ないのですよね?

ユニオンクエリを使う場合は仰るとおりです

JOINで実装する場合は
結合キーである製品IDが、2つのクエリで どのような関係性にあるか
が成否(表内の〇と×)の要因となります

Q部品構成Q組立構成FJOINUNION
×
×
×
×
×

 
今回のご質問では、SQ文で利用されている2つのクエリに対し
行を一意にするキー項目の判別ができなかったこともあり

データの性質次第では、SQLの結果セットで 行の欠損が発生したり 誤った集計結果が出る

という現象を回避できる
ユニオン(縦結合)の回答が適切と判断しました

4
beginner 2024/10/11 (金) 08:38:58 ddfe5@dbc09

mayuさん分かり易い解説ありがとうございます。
リレーションしているからと言ってもどんなデータの関係になっているかですね。大変参考になりました。
お世話になりました。