Объедините два запроса и добавьте новый столбец - PullRequest
0 голосов
/ 10 марта 2020

DB-Fiddle

CREATE TABLE sales (
    id int auto_increment primary key,
    category VARCHAR(255),
    event_date DATE,
    sent_date DATE,
    sales_Product_gross VARCHAR(255), 
    return_Product_gross VARCHAR(255)
);

INSERT INTO sales
(category, event_date, sent_date, 
sales_Product_gross, return_Product_gross
)
VALUES 
("CAT_01", "2017-05-30", "2017-05-30", "500", NULL),
("CAT_01", "2017-06-05", "2017-05-30", NULL, "250"),

("CAT_01", "2018-07-08", "2018-07-08", "700", NULL),
("CAT_01", "2018-07-18", "2018-07-08", NULL, "370"),

("CAT_01", "2019-02-15", "2019-02-15", "400", NULL),
("CAT_01", "2019-03-21", "2019-02-15", NULL, "120"),

("CAT_02", "2019-04-24", "2019-04-24", "300", NULL),
("CAT_02", "2019-04-30", "2019-04-24", NULL, "145"),

("CAT_02", "2019-12-14", "2019-12-14", "900", NULL),
("CAT_02", "2019-12-28", "2019-12-14", NULL, "340"),

("CAT_03", "2020-03-09", "2020-03-09", "800", NULL),
("CAT_03", "2020-03-17", "2020-03-09", NULL, "425");

В таблице отображаются sales и returns в разных categories.

Теперь я хочу вычислить:

a) return_rate на month на campaign и сохранить его в новом столбце с именем calc_type с именем monthly.
b) return_rate на rolling 2 YEAR основе, а также сохранить его в новом столбце calc_type с именем rolling.

Результат должен выглядеть следующим образом:

category       calc_type       year          month       return_rate
CAT_01         rolling         NULL          NULL         0.445  
CAT_01         monthly         2017          5            0.500
CAT_01         monthly         2018          7            0.528        
CAT_01         monthly         2019          2            0.300
CAT_02         rolling         NULL          NULL         0.404
CAT_02         monthly         2019          4            0.480
CAT_02         monthly         2019          12           0.377
CAT_03         rolling         NULL          NULL         0.531
CAT_03         monthly         2020          3            0.531

Я создал запрос для критериев a) и для критериев b) . Отдельно эти запросы работают именно так, как мне нужно.
Теперь я попытался объединить их, используя UNION ALL так же, как это делается здесь :

  SELECT
  category,
  'rolling' AS calc_type,
  'NULL' AS year,
  'NULL' As month,
  sum(return_Product_gross) / sum(sales_Product_gross) as return_rate
  FROM sales
  WHERE sent_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 2 YEAR) AND CURDATE()
  GROUP BY 1,2,3,4
  ORDER BY 1,2,3,4;  

UNION ALL

  SELECT
  category,
  'monthly' AS calc_type,
  YEAR(sent_date) AS year,
  MONTH(sent_date) AS month,
  sum(return_Product_gross) / sum(sales_Product_gross) as return_rate
  FROM sales
  WHERE sent_date BETWEEN "2017-01-01" AND CURDATE()
  GROUP BY 1,2,3,4
  ORDER BY 1,2,3,4;

Однако теперь только значения rolling отображаются в результат.
Что мне нужно изменить в моих запросах, чтобы получить ожидаемый результат?

1 Ответ

0 голосов
/ 10 марта 2020

Этот запрос выглядит сработанным:

 SELECT
  category,
  'rolling' AS calc_type,
  'NULL' AS year,
  'NULL' As month,
  sum(return_Product_gross) / sum(sales_Product_gross) as return_rate
  FROM sales
  WHERE sent_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 2 YEAR) AND CURDATE()
  GROUP BY category, year, month
UNION ALL
  SELECT
  category,
  'monthly' AS calc_type,
  YEAR(sent_date) AS year,
  MONTH(sent_date) AS month,
  sum(return_Product_gross) / sum(sales_Product_gross) as return_rate
  FROM sales
  WHERE sent_date BETWEEN "2017-01-01" AND CURDATE()
  GROUP BY category, year, month
ORDER BY category, calc_type DESC, year, month;

DBFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...