假设我有两个结构相同的表,称之为A& B.此问题唯一关注的列是product_type,price和volume。
product_type&的每个组合。价格可能会在每张表中重复多次,且数量不一。我试图在一个表中找到一个组合的实例,而另一个表中的TOTAL体积不同。
这将包括表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相匹配。 表B中存在Y @ $ 1,但不存在于A. Z @ $ 2存在于两个表中,但它们的总和不同。我希望查询返回违反规则的每个product_type和价格组合(即Y @ $ 1和Z @ $ 2)。
我尝试过使用GROUP,UNION,DISTINCT,子查询以及上面的各种组合,但似乎无法弄明白。
答案 0 :(得分:1)
我相信您正在寻找以下内容。我为语法中的奇怪位置/不道歉,使用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
答案 1 :(得分: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
答案 2 :(得分:0)
这似乎是work for me:
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 | VOLUME | PRODUCT_TYPE | VOLUME | ------------------------------------------------- | Z | 10 | Z | 11 |