mysql - MySQL中多个表的分组和求和

标签 mysql sql

我想根据前两列对 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 syntaxSELECT 转换为 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/

相关文章:

mysql - 如何将 2 列合并为一列并使用该合并列来保存多个值

由于空格,MySQL 在 bash 中发送错误

php - 如何在现有 HTML 文件中添加 PHP 语句(来自 MySQL)的 SQL 结果

SQL 聚合和别名

SQL 查询 - CROSS APPLY OPENJSON - 如何包含 PIVOT

sql - 如何使用 t-sql 更新 xml 变量中的 xml 属性值?

mysql - 选择在另一个字段中共享相同值的项目

mysql - 如何从mysql函数向列表添加数据

php - Twitter 动态输入字段上的 Typeahead 自动完成功能

php - 多对多 Laravel 获取值