简体   繁体   English

如何计算 MySQL 中收入的每日百分比变化?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM