【问题标题】:How to calculate Day on Day % Change in Revenue in MySQL?如何计算 MySQL 中收入的每日百分比变化?
【发布时间】:2020-08-25 12:00:43
【问题描述】:

我有一张收入表,其中包含

日期字段 |国家 |类别 |收入 |买家

我想计算收入的逐日百分比增长。我已经编写了以下代码并得到了正确的输出。但我不确定代码是否是通用的,是否适用于测试输入。

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

请告诉我代码是否正确

预期输出:

+------------+----------+----------------+
| date_field | curr_rev | percent_change |
+------------+----------+----------------+
| 2016-01-21 | 330      | None           |
| 2016-01-22 | 240      |-27.27          |
| 2016-01-23 | 375      | 56.25          |
+------------+----------+----------------+

【问题讨论】:

  • 您应该提供样本数据和期望的结果。
  • @GordonLinoff - 我已经在正文中分享了预期的输出。另外,我使用的是不支持窗口函数的旧版本的 MySQL。

标签: mysql sql database date group-by


【解决方案1】:

如果您运行的是 MySQL 8.0,只需使用窗口函数:

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

在早期版本中,您确实可以连接两个聚合查询。我将其表述为:

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

【讨论】:

  • 我使用的是 MySQL 5.6。你能分享一下这个查询吗?
  • @dharmikonit:是的,我正在输入...请参阅我的答案中的第二个查询。
【解决方案2】:

假设你每天都有数据,我想你想要:

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;

如果您没有每天的数据,那么这有点棘手。一种方法是您正在使用的自联接。另一种方法是窗口框架:

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;

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 2021-10-15
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    相关资源
    最近更新 更多