【问题标题】:Calculate the percentage change with respect to the previous month计算相对于上个月的百分比变化
【发布时间】:2021-06-01 22:59:10
【问题描述】:

我的数据库有关于出租车服务的信息。我需要在 sql 代码中创建一个语句(我正在使用 mysql),该语句确定注册服务数量相对于上个月的百分比变化。

我的列是日期类型:“tpep_pickup_datetime”,格式如下:2020-01-01 00:33:03。

由于第一个月没有和谁比较,所以“variacion_mes_anterior”列的结果必须为NULL,我不知道该怎么做。

我正在使用但对我不起作用的代码语句是:

SELECT DATE_FORMAT(tpep_pickup_datetime, '%Y-%m') as mes, COUNT(id) as servicios,
CONCAT(
( SELECT TRUNCATE((count(test.id)/count(t.id) -1) *100, 0)
  FROM test AS t
  GROUP BY DATE_FORMAT(t.tpep_pickup_datetime, '%Y-%m')
 LIMIT 1
) , "%") as variacion_mes_anterior
FROM test
GROUP BY DATE_FORMAT(tpep_pickup_datetime, '%Y-%m')
ORDER BY DATE_FORMAT(tpep_pickup_datetime, '%Y-%m');  

例子:

id tpep_pickup_datetime
0 2020-01-01 00:33:03
1 2020-01-02 00:33:03
2 2020-01-03 00:33:03
3 2020-02-01 00:33:03
4 2020-02-02 00:33:03
5 2020-02-03 00:33:03
6 2020-02-04 00:33:03

对于我的问题,有效的 sql 语句会出现这种情况

mes servicios variacion_mes_anterior
2020-01 3 NULL
2020-02 4 33%

【问题讨论】:

  • 能否提供一些示例数据和所需的输出
  • variacion_mes_anterior for 2020-02 是 100%,因为当前和上个月 (2000-1000=1000) 之间的差异等于上个月值 (100% * (2000-1000)/1000)?使用一些粗略的值。
  • @Akina 是的,这正是我想应用于我的问题,但我的 sql 代码对我不起作用
  • variacion_mes_anterior = CONCAT(100 * (servicios / LAG(servicios) OVER (ORDER BY mes) - 1), '%')。当然,用它们的表达式替换输出列的名称。
  • @Sergey 修改问题并添加示例

标签: mysql sql percentage


【解决方案1】:
SELECT mes, 
       servicios, 
       CONCAT(ROUND(100 * (servicios / LAG(servicios) OVER (ORDER BY mes) - 1)), '%') variacion_mes_anterior
FROM ( SELECT DATE_FORMAT(tpep_pickup_datetime, '%Y-%m') mes,
              COUNT(*) servicios
       FROM test
       GROUP BY mes ) subquery
ORDER BY mes;

fiddle

【讨论】:

  • @Stone 。 . .在这种情况下,您应该接受答案。请注意,子查询不是必需的,但可能没有害处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
相关资源
最近更新 更多