Mysql 当前月每天累计统计,Mysql 本月第一天

================================

©Copyright 蕃薯耀 2022-11-10

https://www.cnblogs.com/fanshuyao/

 

一、Mysql 本月第一天,Mysql 当前月第一天

-- 本月第一天
SELECT DATE_ADD(CURDATE(), INTERVAL -DAY(CURDATE()) + 1 DAY);
 

-- 本月第一天
SELECT CONCAT(DATE_FORMAT(CURDATE(), '%Y-%m'), '-01');

 

 

二、Mysql 当前月每天累计统计

示例效果(ProductMeteAddUp为每天累计的数量):

Name          CreateTime  ProductMete     ProductMeteAddUp  
------------  ----------  --------------  ------------------
重钢二线       2022-11-07  0.00000000      0.00000000        
重钢二线       2022-11-08  13887.50000000  13887.50000000    
重钢二线       2022-11-09  5212.90000000   19100.40000000 

 

1、方式一:mysql8.0及以上版本可用

#当月每天累计统计(mysql8.0及以上版本可用)
#方式一:
#优点:标准,使用系统函数,无重复过滤条件
#缺点:mysql8.0及以上版本可用
SELECT `Name`,DATE(CreateTime) CreateTime,ProductMete,
SUM(ProductMete) OVER(ORDER BY CreateTime) AS ProductMeteAddUp
FROM Product_Daily
WHERE 1=1
AND NAME ='重钢二线'
AND CreateTime > DATE_ADD(CURDATE(), INTERVAL -DAY(CURDATE()) + 1 DAY)
ORDER BY CreateTime ASC;

 

 

2、方式二:子查询 [各版本通用]

#当月每天累计统计(子查询[各版本通用])
#方式二:
#优点:容易理解
#缺点:子查询存在重复的过滤条件
SELECT `Name`,DATE(CreateTime) CreateTime,ProductMete,
(
    SELECT SUM(p2.ProductMete) 
    FROM Product_Daily p2 
    WHERE 1=1 
    AND p2.Name ='重钢二线'
    AND p2.CreateTime > DATE_ADD(CURDATE(), INTERVAL -DAY(CURDATE()) + 1 DAY)
    AND DATE(p2.CreateTime) <= DATE(p1.CreateTime)
 
) AS ProductMeteAddUp
FROM Product_Daily p1
WHERE 1=1
AND p1.Name ='重钢二线'
AND p1.CreateTime > DATE_ADD(CURDATE(), INTERVAL -DAY(CURDATE()) + 1 DAY)
ORDER BY CreateTime ASC;

 

 

3、方式三:自定义变量实现

#当月每天累计统计(通过自定义变量实现)
#方式三:
#优点:代码简单,无重复过滤条件
#缺点:临时变量,不容易理解
SELECT `Name`,DATE(CreateTime) CreateTime,ProductMete,
@ProductMeteAddUp := @ProductMeteAddUp + ProductMete AS ProductMeteAddUp
FROM Product_Daily,(SELECT @ProductMeteAddUp := 0) temp
WHERE 1=1
AND `Name` ='重钢二线'
AND CreateTime > DATE_ADD(CURDATE(), INTERVAL -DAY(CURDATE()) + 1 DAY)
ORDER BY CreateTime ASC;

 

 

 三、Mysql统计每月1号到当前日期的累计数据,自动补充无数据的日期

 

#当月每天累计统计(通过自定义变量实现),自动补充无数据的日期
SELECT tt.* 
,IFNULL(l.ProductMete, 0) ProductMete
,IFNULL(l.ProductMeteAddUp, 0) ProductMeteAddUp
FROM (
    SELECT
    @date := DATE_ADD(@date, INTERVAL + 1 DAY) `Date`
    FROM
    (
        SELECT @date := DATE_ADD(CURDATE(), INTERVAL - DAY(CURDATE())  DAY)
        FROM sys_date
    ) TIME
    WHERE @date < CURDATE()
) tt
LEFT JOIN (
    SELECT DATE(CreateTime) CreateTime,ROUND(ProductMete / 1000, 1) AS ProductMete,
    ROUND(@ProductMeteAddUp := @ProductMeteAddUp + ProductMete / 1000, 1) AS ProductMeteAddUp
    FROM Product_Daily,(SELECT @ProductMeteAddUp := 0) temp
    WHERE 1=1
    AND `Name` ='重钢二线'
    AND CreateTime > DATE_ADD(CURDATE(), INTERVAL -DAY(CURDATE()) + 1 DAY)
    ORDER BY CreateTime ASC
) l ON l.CreateTime = tt.date
ORDER BY tt.Date ;

 

示例结果:

Date        ProductMete  ProductMeteAddUp  
----------  -----------  ------------------
2022-11-01  0.0          0.0               
2022-11-02  0.0          0.0               
2022-11-03  0.0          0.0               
2022-11-04  0.0          0.0               
2022-11-05  0.0          0.0               
2022-11-06  0.0          0.0               
2022-11-07  0.0          0.0               
2022-11-08  13.9         13.9              
2022-11-09  5.2          19.1              
2022-11-10  0.0          19.1

 

 

(时间宝贵,分享不易,捐赠回馈,^_^)

 

================================

©Copyright 蕃薯耀 2022-11-10

https://www.cnblogs.com/fanshuyao/

posted @ 2022-11-10 10:01  蕃薯耀  阅读(818)  评论(1编辑  收藏  举报