【问题标题】:Calculate percentage on previous month (same year)计算上个月(同年)的百分比
【发布时间】:2018-04-22 20:55:55
【问题描述】:

我如何计算和显示上个月的增长或损失百分比(比较上个月的数字,而不是上一年的数字)。

即Jan 是 500,因此结果将为 0%。那么由于 2 月为 150,百分比损失为 -70%,3 月将显示 -86.67,因为他们的结果仅为 20(与 2 月的 150 相比)

+----------+------+------------+
| Month    | Sale | Difference |
+----------+------+------------|
| January  |  500 |            |
| February |  150 |     -70.00 |
| March    |   20 |     -86.67 |
| April    |  250 |    1150.00 |
| May      |  280 |      12.00 |
| June     |  400 |      42.86 |
| July     |  480 |      20.00 |
+----------+------+------------+

我下面的脚本生成:(我只需要添加另一个百分比列

+----------+-------------------+
| MONTH    | SUM(SALES_AMOUNT) |
+----------+-------------------+
| January  |               500 |
| February |               150 |
| March    |                20 |
| April    |               250 |
| May      |               280 |
| June     |               400 |
| July     |               480 |
+----------+-------------------+


SELECT coalesce(date_format(DATE_PURCHASED, '%M')) AS MONTH,
SUM(SALE_PRICE)
FROM SALE
WHERE YEAR(DATE_PURCHASED) = 2017
GROUP BY month

【问题讨论】:

  • 什么 MySQL 版本?为 sqlfiddle.com 提供示例数据。同时根据该示例数据发布预期输出

标签: mysql


【解决方案1】:

您可能会在月份数减 1 时将查询留给自身。然后您将月份的总和与最后一个月的总和放在一行中,并可以计算百分比。类似于以下内容:

SELECT monthname(concat('1970-', lpad(A.MONTH, 2, '0'), '-01')) AS MONTH,
       A.SALE_PRICE,
       CASE
         WHEN A.SALE_PRICE IS NULL
           THEN NULL
         WHEN B.SALE_PRICE IS NULL
           THEN NULL
         WHEN A.SALE_PRICE = 0
           THEN NULL
         ELSE
           (B.SALE_PRICE / A.SALE_PRICE - 1) * 100
       END AS PERCENTAGE
       FROM (SELECT month(DATE_PURCHASED) AS MONTH,
                    sum(SALE_PRICE) AS SALE_PRICE,
                    FROM SALE
                    WHERE year(DATE_PURCHASED) = 2017
                    GROUP BY MONTH) A
            LEFT JOIN (SELECT month(DATE_PURCHASED) AS MONTH,
                              sum(SALE_PRICE) AS SALE_PRICE,
                              FROM SALE
                              WHERE year(DATE_PURCHASED) = 2017
                              GROUP BY MONTH) B
                      ON A.MONTH - 1 = B.MONTH
       ORDER BY A.MONTH;

注意 AB 是您的查询,只是修改为月份是数字,因为这是在 ON 子句中需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多