Сравните значения в двух таблицах и рассчитайте их разницу - PullRequest
2 голосов
/ 12 апреля 2020

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

В В примере выше у меня есть две таблицы с именами sales и logistics.
Моя цель - сравнить sales_volume KPI sold из таблицы sales с quantity KPI outbound из таблицы logistics.

Я пытался в go с 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

Что мне нужно изменить в своем запросе на получить ожидаемый результат?

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Вы можете сделать 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;

Этот подход работает, даже если две таблицы не имеют абсолютно одинаковые продукты.

0 голосов
/ 12 апреля 2020

Используйте подзапрос и выполните дальнейшую агрегацию:

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;
...