mysql - 如何使用以前的值计算百分比增加/减少

标签 mysql sql

我有一个查询返回按月分组的销售额总值。我想添加一列,返回与前几行相比增长/下降的百分比。

我已经尝试过使用CREATE TEMPORARY TABLE,创建一个变量@var :=,但没有任何效果。理想情况下,我的结果是:

Month | Sales | Perc
1     | 100   | 0
2     | 150   | 50
3     | 100   | -33.33

要做的计算是:((actual_value - previous_value)/previous_value) *100

关于表格,我使用salesproductssales_items,所以我查询检索按月分组的销售总额是:

SELECT 
    MONTH(s.sale_date) AS Month,
    SUM(p.retail_price * si.quantity) AS Sales_Amount
FROM sales s
INNER JOIN sales_items si ON s.sale_id = si.sale_id
INNER JOIN products p ON si.product_id = p.product_id
WHERE YEAR(s.sale_date) = '2018'
GROUP BY month 
ORDER BY month;

因为我正在使用 SUM 来汇总销售项目并将其汇总到每个 sale_id 中,并且在按月分组之后,使用该值似乎很复杂进入一个新的专栏,所以如果有人知道如何去做,那就太好了。

最佳答案

在 MySQL 8.0 中,可以将聚合查询转为子查询,并使用窗口函数 LAG 来访问上个月的值,例如:

SELECT 
    Sales_Month, 
    Sales_Amount, 
    ( Sales_Amount - LAG(Sales_Amount) OVER(ORDER BY Sales_Month) )
        /LAG(Sales_Amount) OVER(ORDER BY Sales_Month) * 100 AS Percent_Increase
FROM (
    SELECT 
        MONTH(s.sale_date) AS Sales_Month,
        SUM(p.retail_price * si.quantity) AS Sales_Amount
    FROM sales s
    INNER JOIN sales_items si ON s.sale_id = si.sale_id
    INNER JOIN products p ON si.product_id = p.product_id
    WHERE YEAR(s.sale_date) = '2018'
    GROUP BY Sales_Month 
) x
ORDER BY Sales_Month

关于mysql - 如何使用以前的值计算百分比增加/减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55425016/

相关文章:

php - 我的 MySQL 查询有什么问题?

mysql - 如何在Spotfire信息链接中获取下拉过滤器?

sql - 如何在 SQL Server 企业管理器中创建表的副本?

java - Spring Security - 为什么要为用户和角色设置单独的类?

php - 根据用户处理 PHP 时区

sql server openrowset一步读取超大xml文件

java - JPQL 带条件的左外连接

sql - 何时使用 "ON UPDATE CASCADE"

php - 从具有相同 id 的同一列中选择一个值

sql - 如何使用spark sql过滤特定聚合的行?