Транспонировать столбцы в строки и строки в столбцы в результате запроса - PullRequest
1 голос
/ 19 марта 2020

DB-Fiddle:

CREATE TABLE sales (
    id int auto_increment primary key,
    product VARCHAR(255),
    sales_date DATE,
    sales_volume INT
);

INSERT INTO sales
(product, sales_date, sales_volume)
VALUES 
("Product A", "2019-03-16", "400"),
("Product B", "2019-03-16", "200"),
("Product A", "2019-03-17", "300"),
("Product A", "2019-03-18", "600"),
("Product A", "2019-03-19", "500"),
("Product B", "2019-03-19", "900"),
("Product A", "2020-03-16", "800"),
("Product A", "2020-03-17", "150"),
("Product B", "2020-03-17", "350"),
("Product A", "2020-03-18", "480"),
("Product B", "2020-03-18", "790"),
("Product A", "2020-03-19", "840"),
("Product A", "2020-03-20", "560");

Из таблицы выше я хочу извлечь sum из sales_volume BETWEEN "2019-03-16" AND "2019-03-18" (PY) и BETWEEN "2020-03-16" AND "2020-03-18" (CY) , чтобы иметь до текущего года сравнение.

Результат должен выглядеть как это:

KPI               PY        CY
sales_volume    1.500     2.570

С помощью следующего запроса я очень близко подхожу к результату:

SELECT

 (CASE
 WHEN DATE(sales_date) BETWEEN "2019-03-16" AND "2019-03-18" THEN "PY"
 WHEN DATE(sales_date) BETWEEN "2020-03-16" AND "2020-03-18" THEN "CY"
 END) AS time,

SUM(sales_volume)
FROM sales
WHERE 
DATE(sales_date) BETWEEN "2019-03-16" AND "2019-03-18"
OR DATE(sales_date) BETWEEN "2020-03-16" AND "2020-03-18"
GROUP BY 1;

Однако он разбит на строки:

time    SUM(sales_volume)
CY          2.570
PY          1.500

Как мне нужно изменить запрос выше, чтобы получить структуру, как в моем ожидаемом результате?

1 Ответ

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

Вы можете сделать условное агрегирование:

select 'sales_volume' as kpi,
       sum(case when sales_date >= '2019-03-16' AND 
                     sales_date <= '2019-03-18' 
                then sales_volume else 0 
          end) as PY,
       sum(case when sales_date >= '2020-03-16' AND 
                     sales_date <= '2020-03-18' 
                then sales_volume else 0 
           end) as CY
from sales s;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...