mysql 按月统计数据 没有数据按0补全

也借鉴了网上的做法,但不全相同,这里补全。

CREATE TABLE num (i int);-- 创建一个表用来储存0-9的数字

INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);-- 生成0-9的数字,方便以后计算时间

CREATE TABLE `calendar ` (
  `datelist` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


 -- 生成一个存储日期的表,datalist是字段名


INSERT INTO calendar (datelist) SELECT
    adddate(
        (   -- 这里的起始日期,你可以换成当前日期
            DATE_FORMAT("2016-12-01", '%Y-%m-%d') ----若写成这种格式,DATE_FORMAT("2016-12", '%Y-%m'),但时间不会累加,不知道为啥
        ),
       INTERVAL  numlist.id  MONTH
    ) AS `date`
FROM
    (
        SELECT
            n1.i + n10.i * 10 + n100.i * 100 + n1000.i * 1000+ n10000.i * 10000 AS id
        FROM
            wx_num n1
        CROSS JOIN wx_num AS n10
        CROSS JOIN wx_num AS n100
        CROSS JOIN wx_num AS n1000
        CROSS JOIN wx_num AS n10000
    ) AS numlist;


update calendar set datelist=left(datelist,7)---只取前7位,即类似2017-02  只到月份。  这里说明下为啥calendar 表datelist字段类型为啥是varchar,为了方便截取,若是date,则截取update就有问题。

---按月统计 员工的销售数量
SELECT cal.datelist , IF(buyTotal IS NULL , 0, buyTotal) buyTotal,IF(activateTotal IS NULL , 0, activateTotal) activateTotal
FROM   
(
select 
FROM_UNIXTIME(oi.pay_time, '%Y-%m') months,
count(case WHEN (oi.pay_status=1 and oi.order_status!=1) then 1 else NULL end ) buyTotal,
count(case WHEN (oi.syn_status=1 and oi.order_status!=1) then 1 else null end ) activateTotal
from order_info oi
where emp_no='cc0075'
group by months 
) order_info    
  
RIGHT JOIN calendar cal on order_info.months = cal.datelist 
where calendar.datelist<='2017-03' ---这个时间可以写也可以不写


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值