Рассчитать средние значения, если значения находятся в разных строках таблицы - PullRequest
2 голосов
/ 10 марта 2020

DB-Fiddle

CREATE TABLE sales (
    id int primary key,
    category VARCHAR(255),
    event_date DATE,
    sales_volume VARCHAR(255), 
    return_volume VARCHAR(255)
);

INSERT INTO sales
(id, category, event_date, 
sales_volume, return_volume
)
VALUES 
("1", "CAT_01", "2018-05-30", "500", NULL),
("2", "CAT_01", "2018-06-05", NULL, "450"),
("3", "CAT_02", "2019-07-08", "700", NULL),
("4", "CAT_02", "2019-07-18", NULL, "670");

В таблице отображаются sales и returns за category.

Сейчас Я хочу вычислить return_rate на returns/sales.
Результат должен выглядеть следующим образом:

Category      sales_volume      return_volume       return_rate
CAT_01           500               450                0.90
CAT_02           700               670                0.96

Я пытался go с этим запросом:

SELECT
category,
sales_volume,
return_volume,
return_volume / sales_volume as return_rate
FROM sales;

Однако, когда я запускаю этот запрос, я получаю NULL для return_rate.
Я предполагаю, что эта проблема вызвана тем, что return_volume находится в строке, отличной от sales_volume.

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

Ответы [ 3 ]

1 голос
/ 10 марта 2020

После повторной проверки я обнаружил, что HeidiSQL на моем компьютере выполняет запрос, даже если он выглядит следующим образом:

SELECT
category,
sales_volume,
return_volume,
sum(return_volume) / sum(sales_volume) as return_rate
FROM sales;

Результат такой:

Category      sales_volume      return_volume       return_rate
CAT_01           0                  0                 0.90
CAT_02           0                  0                 0.96

Когда я запускаю этот запрос в DB - Fiddle , он не проходит, потому что SUM для sales_volume и return_volume, а также GROUP BY 1 отсутствует .

Как только я изменю свой запрос так, чтобы он выглядел следующим образом:

SELECT
category,
sum(sales_volume),
sum(return_volume),
sum(return_volume) / sum(sales_volume) as return_rate
FROM sales
GROUP BY 1;

Я также получу правильный результат здесь DB-Fiddle .

Конечно, другие ответы на этот вопрос также работают.

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

Полагаю, вы можете попробовать запрос ниже -

SELECT
category,
MAX(sales_volume),
MAX(return_volume),
MAX(return_volume) / MAX(sales_volume) as return_rate
FROM sales
GROUP BY category;
0 голосов
/ 10 марта 2020

Используйте coalesce() для замены null значений и агрегирования:

SELECT category, 
       SUM(coalesce(sales_volume, 0)) AS sales_volume, 
       SUM(coalesce(return_volume, 0)) AS return_volume,
       SUM(coalesce(return_volume, 0)) / SUM(coalesce(sales_volume, 0)) AS return_rate
FROM sales
group by category;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...