[英]Calculate averages if values are in different rows in the table
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");
该表显示每个category
的sales
和returns
。
现在我想通过returns/sales
计算return_rate
。
结果应如下所示:
Category sales_volume return_volume return_rate
CAT_01 500 450 0.90
CAT_02 700 670 0.96
我试着用这个查询:
SELECT
category,
sales_volume,
return_volume,
return_volume / sales_volume as return_rate
FROM sales;
但是,当我运行此查询时,我的return_rate
为NULL
。
我认为这个问题是因为return_volume
与sales_volume
位于不同的行中。
我如何修改我的查询以获得预期的结果?
再次检查所有内容后,我发现我的计算机上的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 中运行此查询时,它无法通过,因为sales_volume
和return_volume
的SUM
以及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 。
当然,这个问题的其他答案也适用。
使用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;
我想你可以试试下面的查询 -
SELECT
category,
MAX(sales_volume),
MAX(return_volume),
MAX(return_volume) / MAX(sales_volume) as return_rate
FROM sales
GROUP BY category;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.