因为需要统计本年本月本星期数据,并且要求展现每天的具体量,当某一天没有数据时,就会变成1号 23,2号 22,4号 12
中间三号没有数据的问题,所以这篇文章参考了网上的方法,实现1号 23,2号 22,3号0,4号 12
查询今年数据
select * from Wx_UserInfo where YEAR(CreateTime)=YEAR(NOW()) and IsDeleted=1
查询本月的数据
SELECT count(1) FROM Wx_UserInfo WHERE DATE_FORMAT( CreateTime, '%Y%m' ) = DATE_FORMAT( NOW() , '%Y%m' ) and IsDeleted=1
查询这个星期的数据
select count(1) from Wx_UserInfo where to_days(CreateTime) = to_days(now()) and IsDeleted=1
查询当日的数据
select count(1) from Wx_UserInfo where to_days(CreateTime) = to_days(now()) and IsDeleted=1
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' ---这个时间可以写也可以不写