【问题标题】:MySQL cumulative fiscal year with conditionMySQL 累计会计年度有条件
【发布时间】:2019-10-08 06:33:31
【问题描述】:

我有一个表(MySQL),列:年、月、区域、仓库、金额(我的数据不重复)。

我想通过按区域和仓库的会计年度组来使用“金额”的查询累计。 (财政年度的开始月份是四月)。 例如:

+-----+-------+-----+----------+--------+
| year| month |zone | warehouse| amount |
+-----+-------+-----+----------+--------+
| 2018|   4   |  A  |    WH    |  2400  |
+-----+-------+-----+----------+--------+
| 2018|   4   |  B  |    WH    |  1200  |
+-----+-------+-----+----------+--------+
| 2018|   4   |  A  |    BW    |  200   |
+-----+-------+-----+----------+--------+
| 2018|   5   |  B  |    WH    |  300   |
+-----+-------+-----+----------+--------+
| 2018|   5   |  C  |    CW    |  300   |
+-----+-------+-----+----------+--------+
| 2018|   6   |  A  |    WH    |  450   |
+-----+-------+-----+----------+--------+
| 2018|   7   |  B  |    WH    |  200   |
+-----+-------+-----+----------+--------+
| 2018|   7   |  C  |    CW    |  100   |
+-----+-------+-----+----------+--------+
| 2018|   9   |  A  |    WH    |  1000  |
+-----+-------+-----+----------+--------+
| 2019|   1   |  B  |    WH    |  200   |
+-----+-------+-----+----------+--------+
| 2019|   1   |  C  |    CW    |  100   |
+-----+-------+-----+----------+--------+
| 2019|   3   |  A  |    BW    |  100   |
+-----+-------+-----+----------+--------+
| 2019|   4   |  A  |    WH    |  20    |
+-----+-------+-----+----------+--------+
| 2019|   4   |  B  |    WH    |  10    |
+-----+-------+-----+----------+--------+
| 2019|   5   |  C  |    CW    |  70    |
+-----+-------+-----+----------+--------+
| 2019|   5   |  B  |    WH    |  20    |
+-----+-------+-----+----------+--------+

我想从数据库中选择数据以包括累积: 年、月、区、仓、金额、累计

+-----+-------+-----+----------+--------+------------+
| year| month |zone | warehouse| amount | Cumulative |
+-----+-------+-----+----------+--------+------------+
| 2018|   4   |  A  |    WH    |  2400  |    2400    |
+-----+-------+-----+----------+--------+------------+
| 2018|   4   |  B  |    WH    |  1200  |    1200    |
+-----+-------+-----+----------+--------+------------+
| 2018|   4   |  A  |    BW    |  200   |    200     |
+-----+-------+-----+----------+--------+------------+
| 2018|   5   |  B  |    WH    |  300   |    1500    |
+-----+-------+-----+----------+--------+------------+
| 2018|   5   |  C  |    CW    |  300   |    300     |
+-----+-------+-----+----------+--------+------------+
| 2018|   6   |  A  |    WH    |  450   |    2850    |
+-----+-------+-----+----------+--------+------------+
| 2018|   7   |  B  |    WH    |  200   |    1700    |
+-----+-------+-----+----------+--------+------------+
| 2018|   7   |  C  |    CW    |  100   |    400     |
+-----+-------+-----+----------+--------+------------+
| 2018|   9   |  A  |    WH    |  1000  |    3850    |
+-----+-------+-----+----------+--------+------------+
| 2019|   1   |  B  |    WH    |  200   |    1900    |
+-----+-------+-----+----------+--------+------------+
| 2019|   1   |  C  |    CW    |  100   |    500     |
+-----+-------+-----+----------+--------+------------+
| 2019|   3   |  A  |    BW    |  100   |    300     |
+-----+-------+-----+----------+--------+------------+
| 2019|   4   |  A  |    WH    |  20    |    20      |
+-----+-------+-----+----------+--------+------------+
| 2019|   4   |  B  |    WH    |  10    |    10      |
+-----+-------+-----+----------+--------+------------+
| 2019|   5   |  C  |    CW    |  70    |    70      |
+-----+-------+-----+----------+--------+------------+
| 2019|   5   |  B  |    WH    |  20    |    30      |
+-----+-------+-----+----------+--------+------------+

什么查询可以帮助我做到这一点?

【问题讨论】:

标签: mysql sql


【解决方案1】:

MySQL 现在支持窗口函数。这是解决问题的最佳方法:

SELECT *,
      SUM(amount) OVER (PARTITION BY zone, warehouse, year ORDER BY month) as cumulative
FROM t;

这不仅比子查询更容易表达,而且应该有更好的性能。

【讨论】:

    【解决方案2】:

    您可以为此目的使用子查询:

    SELECT *,
           (SELECT coalesce(sum(temp.amount), 0)
            FROM your_table temp
            WHERE temp.year = your_table.year
              AND temp.month < your_table.month
              AND temp.zone = your_table.zone
              AND temp.warehouse = your_table.warehouse
           ) + amount AS cumulative
    FROM your_table;
    

    您可以在此处查看演示:db< >fiddle

    输出:

    【讨论】:

    • 谢谢。您的查询对我有帮助。现在我学到了更多的'coalesce',:)。
    • @LongNguyễn 不客气。我很高兴它对你有所帮助。并且coalesce() 返回第一个非空值。
    猜你喜欢
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    相关资源
    最近更新 更多