我已经搜索了这个主题,但我得到的只是按月分组结果的问题。我需要检索按月分组的行,总计从开始日期到整个月的成本
这是一个示例表
Date | Val
----------- | -----
2017-01-20 | 10
----------- | -----
2017-02-15 | 5
----------- | -----
2017-02-24 | 15
----------- | -----
2017-03-14 | 20
我需要获得以下输出(日期格式不是这样):
2017-01-20 | 10
2017-02-24 | 30
2017-03-14 | 50
当我跑步时
SELECT SUM(`val`) as `sum`, DATE(`date`) as `date` FROM table
AND `date` BETWEEN :startDate
AND :endDate GROUP BY year(`date`), month(`date`)
我当然每月得到一笔钱。
我没有想到如何在一个查询中很好地放入以实现我想要的效果,可能W需要做一些嵌套查询,但也许你知道一些更好的解决方案。
答案 0 :(得分:1)
您可以同时使用DATE_FORMAT函数,格式化查询和分组。
<强> DATE_FORMAT(日期,格式)强>
根据格式字符串格式化日期值。
SELECT Date, @total := @total + val as total
FROM
(select @total := 0) x,
(select Sum(Val) as Val, DATE_FORMAT(Date, '%m-%Y') as Date
FROM st where Date >= '2017-01-01' and Date <= '2017-12-31'
GROUP BY DATE_FORMAT(Date, '%m-%Y')) y
;
+---------+-------+
| Date | total |
+---------+-------+
| 01-2017 | 10 |
+---------+-------+
| 02-2017 | 30 |
+---------+-------+
| 03-2017 | 50 |
+---------+-------+
答案 1 :(得分:1)
这样的事情应该有效(untestet)。你也可以通过使用子查询解决这个问题,但我想这会更昂贵。如果您希望按总值对结果进行排序,则子查询变量可能会更快。
SET @total:=0;
SELECT
(@total := @total + q.sum) AS total, q.date
FROM
(SELECT SUM(`val`) as `sum`, DATE(`date`) as `date` FROM table
AND `date` BETWEEN :startDate
AND :endDate GROUP BY year(`date`), month(`date`)) AS q
答案 2 :(得分:0)
试试这个。
我使用yearmonth作为整数(日期的年份乘以100加上日期的月份)。如果你想重新格式化,你的调用,但整数总是快一点。
完整的方案,包括输入数据。
CREATE TABLE tab (
dt DATE
, qty INT
);
INSERT INTO tab(dt,qty) VALUES( '2017-01-20',10);
INSERT INTO tab(dt,qty) VALUES( '2017-02-15', 5);
INSERT INTO tab(dt,qty) VALUES( '2017-02-24',15);
INSERT INTO tab(dt,qty) VALUES( '2017-03-14',20);
SELECT
yearmonths.yearmonth
, SUM(by_month.month_qty) AS running_qty
FROM (
SELECT DISTINCT
YEAR(dt) * 100 + MONTH(dt) AS yearmonth
FROM tab
) yearmonths
INNER JOIN (
SELECT
YEAR(dt) * 100 + MONTH(dt) AS yearmonth
, SUM(qty) AS month_qty
FROM tab
GROUP BY YEAR(dt) * 100 + MONTH(dt)
) by_month
ON yearmonths.yearmonth >= by_month.yearmonth
GROUP BY yearmonths.yearmonth
ORDER BY 1;
;
yearmonth|running_qty
201,701| 10.0
201,702| 30.0
201,703| 50.0
select succeeded; 3 rows fetched
需要解释吗?
我的解决方案优于其他解决方案,当您将其移动到更现代的数据库时,它可以在不进行更改的情况下重复使用 - 您可以在有时间时将其转换为使用分析函数。
Marco the Sane