如何总结从开始月份到当月每月的记录

时间:2017-02-06 15:38:01

标签: mysql sql

我已经搜索了这个主题,但我得到的只是按月分组结果的问题。我需要检索按月分组的行,总计从开始日期到整个月的成本

这是一个示例表

   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需要做一些嵌套查询,但也许你知道一些更好的解决方案。

3 个答案:

答案 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    |
+---------+-------+

可在此处查看:http://rextester.com/FOQO81166

答案 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