簡體   English   中英

我怎樣才能在它之前得到每個月的總和?

[英]how can I get a sum of every month before its?

我有一個如下的 MySQL 表。

| id | money | date |
| ---- | ---- | ----|
| 1 | 100 | 2020-01-01 |
| 2 | 150 | 2020-01-15 |
| 3 | 70 | 2020-02-01 |
| 4 | 80 | 2020-02-06 |
| 5 | 100 | 2020-03-02 |
| 6 | 100 | 2020-03-16 |
| 7 | 200 | 2020-04-08 |

我想得到這樣的結果

| year-month | sumMoney |
| ---- | ---- |
| 2020-01 | 250 |
| 2020-02 | 400 |
| 2020-03 | 600 |
| 2020-04 | 800 |

sql怎么寫?

使用DATE_FORMAT按年和月聚合:

SELECT
    yearmonth,
    SUM(sumMoney) OVER (ORDER BY yearmonth) AS sumMoney
FROM
(
    SELECT DATE_FORMAT(date, '%Y-%m') AS yearmonth, SUM(money) AS sumMoney
    FROM yourTable
    GROUP BY DATE_FORMAT(date, '%Y-%m')
) t
ORDER BY
    yearmonth;

由於 MySQL 8.0 引入了窗口函數,您可以使用下一個查詢:

SELECT DISTINCT
  DATE_FORMAT(date, '%Y-%m') mnth,
  SUM(money) OVER (ORDER BY DATE_FORMAT(date, '%Y-%m') ) AS sumMoney
FROM test;

在這里測試查詢

結果:

yearmonth | sumMoney
----------+---------
2020-01   |      250
2020-02   |      400
2020-03   |      600
2020-04   |      800

最舊 MySQL 版本的解決方案:

select 
    cur.mn, 
    (ifnull(sum(prev.prev_sum),0) + money) as rolling_sum 
from (
    select sum(money) money, DATE_FORMAT(date, '%Y-%m')  mn
    from test
    group by DATE_FORMAT(date, '%Y-%m')
) cur
left join (
    select sum(money) prev_sum, DATE_FORMAT(date, '%Y-%m')  prev_mn
    from test
    group by DATE_FORMAT(date, '%Y-%m')
) prev on prev.prev_mn < cur.mn
group by cur.mn
order by mn;

在線運行 PHP

您需要對列求和,然后按年和月分組。

SELECT
    DATE_FORMAT(date, "%Y-%m") AS, 'year-month' SUM(money) AS 'sumMoney' 
FROM table1 
GROUP BY YEAR(date), MONTH(date)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM