[英]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;
您需要對列求和,然后按年和月分組。
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.