比较两个表中的值并计算它们的差值

Compare values in two tables and calculate the difference of them

DB-Fiddle

/* Table Sales */
CREATE TABLE sales (
    id int auto_increment primary key,
    product VARCHAR(255),
    KPI VARCHAR(255),
    sales_volume INT
);

INSERT INTO sales
(product, KPI, sales_volume)
VALUES 
("Product A", "sold", "500"),
("Product A", "sold", "300"),
("Product B", "sold", "200"),
("Product C", "sold", "300"),
("Product D", "sold", "900");


/* Table Logistics */
CREATE TABLE logistics (
    id int auto_increment primary key,
    product VARCHAR(255),
    KPI VARCHAR(255),
    quantity INT
);

INSERT INTO logistics
(product, KPI, quantity)
VALUES 
("Product A", "outbound", "800"),
("Product B", "outbound", "100"),
("Product B", "outbound", "400"),
("Product C", "outbound", "250"),
("Product D", "outbound", "900");

预期结果:

product         value_in_sales      value_in_logistics      differnce_of_values
Product A        800                     800                       0
Product B        200                     500                       300
Product C        300                     250                       -50
Product D        900                     900                       0

在上面的示例中,我有两个 table,分别称为 saleslogistics
我的目标是比较 table sales 的 KPI soldsales_volume 与 [=] outbound 的 KPI outboundquantity 39=] logistics.

我尝试使用 UNION ALL,但它只会将两个 table 的值排序在彼此下方,并且不会像预期结果那样比较它们。

SELECT
product,
KPI,
SUM(sales_volume)
FROM sales
GROUP BY 1

UNION ALL

SELECT
product,
KPI,
SUM(quantity)
FROM logistics
GROUP BY 1

我需要在查询中更改什么才能获得预期结果?

你可以做union all然后再聚合:

SELECT product, SUM(sales) as sales, SUM(logistics) as logistics,
       (SUM(logistics) - SUM(sales)) as diff
FROM ((SELECT product, SUM(sales_volume) as sales, 0 as logistics
       FROM sales
       WHERE KPI = 'sold'
       GROUP BY product
      ) UNION ALL
      (SELECT product, 0, SUM(quantity)
       FROM logistics
       WHERE KPI = 'outbound'
       GROUP BY product
      )
     ) p
GROUP BY product;

即使两个表没有完全相同的产品,这种方法也有效。

使用子查询并做进一步聚合:

SELECT Product, SUM(logistics),  SUM(Sales),
       SUM(logistics) - SUM(Sales)
FROM (SELECT product, 0 AS logistics, SUM(sales_volume) AS Sales
      FROM sales
      WHERE KPI = 'sold'
      GROUP BY Product
      UNION ALL
      SELECT product, SUM(quantity), 0 
      FROM logistics
      WHERE KPI = 'outbound'
      GROUP BY Product
     ) t
GROUP BY Product;