[英]How to calculate Day on Day % Change in Revenue in MySQL?
I have a table revenue which contains我有一张收入表,其中包含
Date_Field |日期字段 | Country |
国家 | Category |
类别 | Revenue |
收入 | Buyers
买家
I want to calculate Day on Day percentage increase in revenue.我想计算收入的每日百分比增长。 I have written the below code and am getting the correct output.
我已经编写了以下代码,并且得到了正确的 output。 But I am not sure whether the code is generic and will work for test inputs.
但我不确定代码是否通用并且适用于测试输入。
select a.date_field, a.curr_rev,
case when prev_revenue is null then 'None'
else round(((curr_rev - prev_revenue)/prev_revenue*100),2)
end as percent_change
from
(select a.date_field, a.revenue as curr_rev, b. revenue as prev_revenue from (
select date_field, sum(revenue) as revenue from revenue group by date_field) a
left join
(select date_field, sum(revenue) as revenue from revenue group by date_field) b
on a.date_field = b.date_field + interval 1 day) a
order by a.date_field
Please let me know whether the code is correct or not请让我知道代码是否正确
Expected Output:预期 Output:
+------------+----------+----------------+
| date_field | curr_rev | percent_change |
+------------+----------+----------------+
| 2016-01-21 | 330 | None |
| 2016-01-22 | 240 |-27.27 |
| 2016-01-23 | 375 | 56.25 |
+------------+----------+----------------+
If you are running MySQL 8.0, just use window functions:如果您正在运行 MySQL 8.0,只需使用 window 函数:
select
date_field,
sum(revenue) curr_rev,
round(
(sum(revenue) - lag(sum(revenue)) over(order by date_field))
/ lag(sum(revenue)) over(order by date_field)
* 100,
2
) percent_change
from mytable
In earlier versions, you can indeed join two aggregate queries.在早期版本中,您确实可以加入两个聚合查询。 I would phrase this as:
我将其表述为:
select
cur.date_field,
cur.revenue cur_rev,
round((cur.revenue - prev.revenue) / prev.revenue * 100, 2) percent_change
from (select date_field, sum(revenue) revenue from mytable group by date_field) cur
left join (select date_field, sum(revenue) revenue from mytable group by date_field) prev
on prev.date_field = cur.date_field - interval 1 day
Assuming you have data for each day, I think you want:假设您每天都有数据,我认为您想要:
select date_field,
sum(revenue) as revenue,
100 * ((sum(revenue) / lag(sum(revenue)) over (order by date_field)) - 1) as increase
from revenue
group by date_field;
If you don't have data on each day, then this is a little tricky.如果您没有每天的数据,那么这有点棘手。 One method is the self-join you are using.
一种方法是您正在使用的自联接。 Another method is a window frame:
另一种方法是 window 框架:
select date_field,
sum(revenue) as revenue,
100 * ((sum(revenue) /
max(sum(revenue)) over (order by date_field range between interval 1 day preceding and 1 day preceding)
) - 1
) as increase
from revenue
group by date_field;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.