我想根据前两列对 2 个表进行分组。我已经成功地做到了这一点,代码如下所示。 我需要一些帮助来对每个表中的剩余列求和,并使用重命名的列插入到我的输出表中,如下所示。 在输出中,FORECAST 列是 MI_STAT_TOTAL 表的结果,SALES 列是 SALES_TOTAL 表的结果。
表:MI_STAT_TOTAL
Planning_Hierarchy_2 Region_Description Measure_Values
xx LATAM 2
yy ASPAC 3
zz EMEA 4
zz EMEA 1
aa ASPAC 1
表:SALES_TOTAL
Product_Number Region Item_Values
xx LATAM 1
yy ASPAC 2
zz EMEA 2
zz EMEA 1
bb USA 2
预期输出 表:P2_Region_Unique
Product_Number Region Forecast Sales
xx LATAM 2 1
yy ASPAC 3 2
zz EMEA 5 3
aa ASPAC 1
bb USA 2
下面的代码只考虑两个表之间的 GROUP BY 而不是 SUM:
CREATE TABLE P2_Region_Unique (
Product_Number VARCHAR(100),
Region VARCHAR(13)
);
INSERT INTO P2_Region_Unique
SELECT s.Planning_Hierarchy_2 AS Product_Number, s.Region_Description` AS Region
FROM MI_STAT_TOTAL s
UNION
SELECT m.`Product Number` AS `Product_Number`, m.`Region` AS Region
FROM SALES_TOTAL m;
考虑到 SUM 的预期输出表格式
CREATE TABLE P2_Region_Unique (
`Product Number` VARCHAR(100),
`Region` VARCHAR(13),
`Forecast` DECIMAL (20,10),
`Sales` DECIMAL (20,10)
);
最佳答案
在 MySQL 中,您可以使用 INSERT ... SELECT
syntax 将 SELECT
转换为 INSERT
.
您的样本数据表明您正在处理 N-M 连接。首先要做的是将聚合移动到子查询中,如下所示:
INSERT INTO P2_Region_Unique
SELECT s.product_number, s.region, f.forecast, s.sales
FROM
(
SELECT product_number, region, SUM(item_values) sales
FROM SALES_TOTAL
GROUP BY product_number, region
) s
LEFT JOIN (
SELECT planning_hierarchy_2 product_number, region_description region, SUM(measure_values) forecast
FROM MI_STAT_TOTAL
GROUP BY planning_hierarchy_2, region_description
) f ON f.product_number = s.product_number AND f.region = s.region
GROUP BY s.product_number, s.region
这会起作用,但不会从连接的两端 返回记录。为此,您可以使用 UNIONed 查询模拟 FULL OUTER JOIN(正如@Nick 所指出的,MySQL 不支持),例如:
INSERT INTO P2_Region_Unique
SELECT s.product_number, s.region, f.forecast, s.sales
FROM
(
SELECT product_number, region, SUM(item_values) sales
FROM SALES_TOTAL
GROUP BY product_number, region
) s
LEFT JOIN (
SELECT planning_hierarchy_2 product_number, region_description region, SUM(measure_values) forecast
FROM MI_STAT_TOTAL
GROUP BY planning_hierarchy_2, region_description
) f ON f.product_number = s.product_number AND f.region = s.region
GROUP BY s.product_number, s.region
UNION
SELECT f.product_number, f.region, f.forecast, s.sales
FROM
(
SELECT planning_hierarchy_2 product_number, region_description region, SUM(measure_values) forecast
FROM MI_STAT_TOTAL
GROUP BY planning_hierarchy_2, region_description
) f
LEFT JOIN (
SELECT product_number, region, SUM(item_values) sales
FROM SALES_TOTAL
GROUP BY product_number, region
) s ON f.product_number = s.product_number AND f.region = s.region
GROUP BY f.product_number, f.region
UNION
运算符消除子查询中的重复项。
这个 demo on DB Fiddle 产量:
| product_number | region | forecast | sales |
| -------------- | ------ | -------- | ----- |
| aa | ASPAC | 1 | |
| bb | USA | | 2 |
| xx | LATAM | 2 | 1 |
| yy | ASPAC | 3 | 2 |
| zz | EMEA | 5 | 3 |
关于mysql - MySQL中多个表的分组和求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54498578/