首页 > 解决方案 > 使用 LAG 获取每月进度百分比的难度

问题描述

我有下表,并想了解每月总交易量的每月演变(%)。我研究了LAG函数,但不能很好地理解。

我需要这个查询的返回是这样的(期望的输出):

MONTH | TOTAL TRANSACTIONS  | % EVOLUTION
----------------------------------------
09    | 45.561              | 0%
10    | 48.598              | 6.66%

更新

% EVOLUTION = ((当前值 - 先前值) / 先前值) * 100

这是我用来计算从一个月到上个月的交易数量演变的公式。也就是说,需要包含上个月总计的列。

DDL

CREATE TABLE IF NOT EXISTS `campanha` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ano_mes` date DEFAULT NULL,
  `nome` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  `cpf` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `conta` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `valor` float(10,2) UNSIGNED ZEROFILL NOT NULL,
  `transacoes` int(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

有谁能够帮助我?

MySQL 版本:5.7.23 - MySQL 社区服务器

http://sqlfiddle.com/#!9/73f38f/2

标签: mysqlaggregate-functionswindow-functionsmysql-5.7

解决方案


MySQL 5.x 不支持窗口函数,例如LAG. 您将不得不以旧方式进行操作。基于表结构,以下查询应该可以帮助您入门:

SELECT yyyy
     , mm
     , txn_this_month
     , (txn_this_month - (
           SELECT SUM(transacoes)
           FROM campanha
           WHERE ano_mes >= STR_TO_DATE(CONCAT_WS('-', yyyy, mm, 1),'%Y-%c-%e') - INTERVAL 1 MONTH
           AND   ano_mes <  STR_TO_DATE(CONCAT_WS('-', yyyy, mm, 1),'%Y-%c-%e')
       )) / txn_this_month * 100 AS perc_change
FROM (
    SELECT EXTRACT(YEAR FROM ano_mes) AS yyyy
         , EXTRACT(MONTH FROM ano_mes) AS mm
         , SUM(transacoes) AS txn_this_month
    FROM campanha
    GROUP BY EXTRACT(YEAR FROM ano_mes), EXTRACT(MONTH FROM ano_mes)
) AS x
ORDER BY yyyy, mm

select 中的子查询为每一行计算上个月的总和。


推荐阅读