2

同じ構造の2つのテーブルがあり、それらをAとBと呼んでいるとします。この問題で懸念される列は、product_type、price、およびvolumeだけです。

product_typeとpriceの各組み合わせは、ボリュームを変えて各テーブルで複数回繰り返すことができます。あるテーブルで他のテーブルとは異なる合計ボリュームを持つ組み合わせのインスタンスを見つけようとしています。

これには、テーブルAの組み合わせがテーブルBにまったく表示されていない場合、またはその逆の場合が含まれます。

===================

例:

表A:

ID   Product_type   Price  Volume
---  ------------   -----  ------
1         X           $1     10
2         X           $1     11
3         Z           $2     10

表B:

ID   Product_type   Price  Volume
--   -------------  -----  -------
1         X           $1     21
2         Y           $1     5
3         Z           $2     7
4         Z           $2     4

表AのX@$ 1のボリュームの合計は21であり、テーブルBと一致することに注意してください。Y@ $ 1はテーブルBに存在しますが、Aには存在しません。Z@ $ 2は両方のテーブルに存在しますが、ボリュームの合計は異なります。ルールに違反する各product_typeとpriceの組み合わせ(つまり、Y @$1とZ@$ 2)を返すクエリが必要です。

GROUP、UNION、DISTINCT、サブクエリ、および上記のさまざまな組み合わせを使用してみましたが、理解できないようです。

4

3 に答える 3

1

以下はあなたが探していたものだと思います。構文のwhere/notがおかしいことをお詫びします。concatのサブクエリでは、これが最も読みやすいアプローチのようです。

(
SELECT
  "TableA",
  TA.*

FROM TableA AS TA

WHERE CONCAT(product_type, price,
             (SELECT SUM(volume) FROM TableA WHERE product_type = TA.product_type AND price = TA.price))

NOT IN (SELECT CONCAT(product_type, price, SUM(volume)) FROM TableB GROUP BY product_type, price)
)

UNION

(
SELECT
  "TableB",
  TB.*

FROM TableB AS TB

WHERE CONCAT(product_type, price,
             (SELECT SUM(volume) FROM TableB WHERE product_type = TB.product_type AND price = TB.price))

NOT IN (SELECT CONCAT(product_type, price, SUM(volume)) FROM TableA GROUP BY product_type, price)
)

#ORDER BY <column>

出力:

TableA  ID  Product_type  Price  Volume
TableA  3   Z             $2     10
TableB  2   Y             $1     5
TableB  3   Z             $2     7
TableB  4   Z             $2     4
于 2012-09-18T20:41:21.190 に答える
0
create table a (ID integer, Product_type char(1), Price float, Volume integer);
create table b (ID integer, Product_type char(1), Price float, Volume integer);

insert into a (ID, Product_type, Price, Volume) values
(1, 'X', 1, 10),
(2, 'X', 1, 11),
(3, 'Z', 2, 10)
;
insert into b (ID, Product_type, Price, Volume) values
(1, 'X', 1, 21),
(2, 'Y', 1, 5),
(3, 'Z', 2, 7),
(4, 'Z', 2, 4)
;

select 
    a.Product_type as Product_type_a,
    a.Price as Price_a,
    a.Volume as Volume_a,
    b.Product_type as Product_type_b,
    b.Price as Price_b,
    b.Volume as Volume_b
from (
        select Product_type, Price, sum(Volume) as Volume
        from a
        group by Product_type, Price
    ) a
    full outer join (
        select Product_type, Price, sum(Volume) as Volume
        from b
        group by Product_type, Price
    ) b on a.Product_type = b.Product_type and a.Price = b.Price
where 
    a.Volume != b.Volume
    or a.Volume is null or b.Volume is null
;
 product_type_a | price_a | volume_a | product_type_b | price_b | volume_b 
----------------+---------+----------+----------------+---------+----------
 Z              |       2 |       10 | Z              |       2 |       11
                |         |          | Y              |       1 |        5
于 2012-09-18T19:41:10.713 に答える
0

これは私にとってはうまくいくようです

SELECT a.Product_type, a.volume, b.Product_type, b.volume
FROM
  (SELECT Product_type, SUM(volume) AS volume
  FROM tbl1 GROUP BY Product_type) a
INNER JOIN
  (SELECT Product_type, SUM(volume) AS volume
  FROM tbl2 GROUP BY Product_type) b ON b.Product_type = a.Product_type
WHERE a.volume <> b.volume

結果

| PRODUCT_TYPE | ボリューム| PRODUCT_TYPE | ボリューム|
-------------------------------------------------
| Z | 10 | Z | 11 |
于 2012-09-18T19:46:33.723 に答える