アプリ版:「スタンプのみでお礼する」機能のリリースについて

Access2007を使用しています。
2つのテーブルに品番と数量がそれぞれ登録されています。

【テーブルA】
品番  / 数量
あ001/ 4
い001/ 5
あ001/ 1

【テーブルB】
品番  / 数量
う000/ 10
あ001/ 1
い001/ 4
い001/ 1

この2つのテーブルから、品番ごとの数量を比較して、異なるデータの品番と差異を取り出したいのです。

【結果】
あ001/ 4(←A-B=4)
う000/ 10

A,Bのテーブルで品番ごとに集計した結果から、数量が不一致のものを取り出す方法がわかりません。
どうぞよろしくお願いいたします。

A 回答 (2件)

■01.AとB用の集計クエリをそれぞれ作成


作成理由:同じテーブルに同品番が存在している事から先に集計クエリを用意する
※テーブルAで言えば「あ001」が重複/テーブルBで言えば「い001」が重複
集計クエリー:品番(グループ)/数量(合計)で、AとB用を作成
(A-SumQuery,B-SumQueryとでもしておく)

■02.上記集計クエリーに対し、品番一致クエリと品番不一致クエリのSQL文を構想しておく
 ※クエリ自体は未作成(SQL文を把握するのに一時的に作成し確認)
02.01.品番一致するものでAB値の計算を行い計算値が0の物は除外するSQL文を構想する
<例SQL文>
SELECT [A-SumQuery].A品番, [A数量の合計]-[B数量の合計] AS 小計
FROM [A-SumQuery] INNER JOIN [B-SumQuery] ON [A-SumQuery].A品番 = [B-SumQuery].B品番
WHERE ((([A数量の合計]-[B数量の合計])<>0))

02.02.テーブルAから見たテーブルBに存在しない品番不一致SQL文を構想する
<例SQL文>
SELECT [A-SumQuery].A品番, [A-SumQuery].A数量の合計
FROM [A-SumQuery] LEFT JOIN [B-SumQuery] ON [A-SumQuery].A品番 = [B-SumQuery].B品番
WHERE ((([B-SumQuery].B品番) Is Null));

02.03.テーブルBから見たテーブルAに存在しない品番不一致SQL文を構想する
<例SQL文>
SELECT [B-SumQuery].B品番, [B-SumQuery].B数量の合計
FROM [B-SumQuery] LEFT JOIN [A-SumQuery] ON [B-SumQuery].B品番 = [A-SumQuery].A品番
WHERE ((([A-SumQuery].A品番) Is Null));

■03.02で構想したSQL文をユニオンクエリで一元化する
品番一致クエリ(02.01)と、品番不一致A(02.02)と、品番不一致B(02.03)の3種のクエリを、ユニオンで纏め上げる

<例SQL>
SELECT [A-SumQuery].A品番 AS 品番, [A数量の合計]-[B数量の合計] AS 数量
FROM [A-SumQuery] INNER JOIN [B-SumQuery] ON [A-SumQuery].A品番 = [B-SumQuery].B品番
WHERE ((([A数量の合計]-[B数量の合計])>0))

UNION SELECT [A-SumQuery].A品番, [A-SumQuery].A数量の合計
FROM [A-SumQuery] LEFT JOIN [B-SumQuery] ON [A-SumQuery].A品番 = [B-SumQuery].B品番
WHERE ((([B-SumQuery].B品番) Is Null))

UNION SELECT [B-SumQuery].B品番, [B-SumQuery].B数量の合計
FROM [B-SumQuery] LEFT JOIN [A-SumQuery] ON [B-SumQuery].B品番 = [A-SumQuery].A品番
WHERE ((([A-SumQuery].A品番) Is Null));

■まとめ
それぞれの役割を持ったクエリ(SQL文)を作成し、ユニオンクエリとして纏め上げて利用する
    • good
    • 0
この回答へのお礼

細かく教えていただき大変助かりました。
おかげさまでうまく出来ました。ありがとうございました。

お礼日時:2009/06/09 11:29

>A,Bのテーブルで品番ごとに集計した結果から、数量が不一致のものを取り出す方法がわかりません。



この質問と、お望みの結果は異なりますよね?
>あ001/ 4(←A-B=4)
>う000/ 10
集計結果を取り出すのではく 集計した差分を取り出そうとしていますね。
A-B=4 とされているので
であれば、う000は A-B=-10ではないでしょうか?
あ001/ 4
う000/ -10
差を取るのであれば、どちらか基準側が必要ですので
A-Bで差が0以外を抽出すると

SQLビュー

SELECT 品番, 差分 from
(
SELECT 品番, Sum(数量) AS 差分
FROM
(SELECT テーブルA.品番, テーブルA.数量
FROM テーブルA
union all
SELECT テーブルB.品番, テーブルB.数量 * -1
FROM テーブルB)
GROUP BY 品番
)
where 差分 <> 0
order by 品番

2007での結果
品番 差分
あ001 4
う000 -10

結果をこちらで読み替えました
意味が違っていたら、読み捨ててください。
また、SQlビューに貼り付けて実行できるように 1SQLで書きましたが
個別にクエリーにされても 問題ありません。
    • good
    • 0
この回答へのお礼

>であれば、う000は A-B=-10ではないでしょうか?
お恥ずかしいです。そのとおりです。間違えていました。
そしてうまくいきました!大変助かりました。ありがとうございました。

お礼日時:2009/06/09 11:26

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