Группа и сумма из нескольких таблиц в MySQL - PullRequest
0 голосов
/ 03 февраля 2019

Я хотел бы сгруппировать таблицы 2 на основе первых двух столбцов.Я успешно сделал это, и код можно увидеть ниже.Мне нужна помощь, чтобы суммировать оставшийся столбец из каждой таблицы и вставить в мою выходную таблицу переименованный столбец, как можно увидеть ниже.В выходных данных столбец FORECAST является результатом таблицы MI_STAT_TOTAL, а столбец SALES является результатом таблицы SALES_TOTAL.

TABLE: 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

TABLE: 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 между двумя таблицами, но не СУММУ:

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;

ФОРМАТ ОЖИДАЕМЫХ ВЫХОДНЫХ ТАБЛИЦ с учетомчто СУММА также включена

CREATE TABLE P2_Region_Unique (
  `Product Number` VARCHAR(100),
  `Region` VARCHAR(13),
  `Forecast` DECIMAL (20,10),
  `Sales` DECIMAL (20,10)
  );

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Попробуйте

select 
  s.ProductNumber,
  s.Region,
  sum(measureValues) Forecast,
  sum(itemValues) Sales
from MI_STAT_TOTAL m
FULL OUTER join SALES_TOTAL s
  on m.PlanningHierarcy2 = s.ProductNumber
group by
  s.ProductNumber,
  s.Region

для операции вставки

 INSERT INTO P2_Region_Unique
    select 
      s.ProductNumber,
      s.Region,
      sum(measureValues) Forecast,
      sum(itemValues) Sales
    from MI_STAT_TOTAL m
    FULL OUTER join SALES_TOTAL s
      on m.PlanningHierarcy2 = s.ProductNumber
    group by
      s.ProductNumber,
      s.Region

, если ваша версия MySQL ниже версии 8, то

select 
  s.ProductNumber,
  s.Region,
  sum(measureValues) Forecast,
  sum(itemValues) Sales
from 
(
  SELECT * from MI_STAT_TOTAL m
  LEFT join SALES_TOTAL s
    on m.PlanningHierarcy2 = s.ProductNumber
  union 
  SELECT * from MI_STAT_TOTAL m
  RIGHT JOIN SALES_TOTAL s
    on m.PlanningHierarcy2 = s.ProductNumber
)
group by
  s.ProductNumber,
  s.Region
0 голосов
/ 03 февраля 2019

В MySQL вы можете превратить SELECT в INSERT, используя синтаксис INSERT ... SELECT .

Ваши данные показывают, что вы имеете дело с объединением NM.Первое, что нужно сделать, это переместить агрегацию в подзапросы следующим образом:

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

Это будет работать, но не будет возвращать записи из обоих концов соединения.Для этого вы можете эмулировать FULL OUTER JOIN (который, как указывает @Nick, не поддерживается в MySQL) с запросами UNION, например:

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 удаляет дубликаты в подзапросах.

Эта демонстрация на 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     |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...