/* 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在上面的示例中,我有两个表,名为sales和logistics。
我的目标是比较表sales中KPI sold的sold和表logistics中KPI outbound的quantity。
我尝试使用UNION ALL,但是它只对两个表的值进行排序,而不是按照预期的结果进行比较。
SELECT
product,
KPI,
SUM(sales_volume)
FROM sales
GROUP BY 1
UNION ALL
SELECT
product,
KPI,
SUM(quantity)
FROM logistics
GROUP BY 1要获得预期的结果,需要在查询中更改哪些内容?
发布于 2020-04-12 14:28:47
使用子查询&做进一步的聚合:
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;发布于 2020-04-12 14:27:02
您可以执行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;即使这两个表没有完全相同的产品,这种方法也是有效的。
https://stackoverflow.com/questions/61172928
复制相似问题