首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何利用前一数值计算增减百分比

如何利用前一数值计算增减百分比
EN

Stack Overflow用户
提问于 2019-03-29 20:25:03
回答 3查看 2K关注 0票数 1

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

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

代码语言:javascript
运行
复制
Month | Sales | Perc
1     | 100   | 0
2     | 150   | 50
3     | 100   | -33.33

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

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

代码语言:javascript
运行
复制
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中,在按月分组之后,将该值用于新列似乎很复杂,因此如果有人知道如何做这件事,那就太好了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-29 20:35:27

在MySQL 8.0中,可以将聚合查询转换为子查询,并使用窗口函数LAG访问前一个月的值,如下所示:

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2019-03-29 20:45:30

您可以添加一个新列"PrevMonthSales“。要做到这一点,您必须自己加入查询:

代码语言:javascript
运行
复制
SELECT ...
FROM
(...your_query...) s1
LEFT JOIN (...your_query...) s2 ON s2.Month = s1.Month - 1

就你而言:

代码语言:javascript
运行
复制
SELECT s1.Month, s1.Sales_Amount, 
    COALESCE(s2.Sales_Amount, 0) "PrevMonthSales",
CASE
    WHEN s1.Sales_Amount = 0 THEN 0
    ELSE     (s1.Sales_Amount - COALESCE(s2.Sales_Amount, 0)) / s1.Sales_Amount 
END "Percent"
FROM
    (...your_query...) s1
    LEFT JOIN (...your_query...) s2 ON s2.Month = s1.Month - 1
票数 0
EN

Stack Overflow用户

发布于 2019-03-29 22:02:35

在名为month_sales的临时表下面创建

代码语言:javascript
运行
复制
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;

查询以查找逐个月之间的差异是:

代码语言:javascript
运行
复制
SELECT *, 
case 
when m2.Sales_Amount is null then 0 
else (m2.Sales_Amount - m1.Sales_Amount)/m1.Sales_Amount 
end as Perc
FROM month_sales m1
left Join month_sales m2
WHERE m1.month = m2.month - 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55425016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档