mysql 查询分组问题,根据年月 人员分组

查询根据月和人员分组

 select e.id eid,e.name ename,c.name cname,DATE_FORMAT(s.change_time,'%Y-%m') weeks,
sum(s.intergral_num) count,t.integral from sec_employee e
LEFT JOIN sec_integral_table t on e.id=t.emp_id
LEFT JOIN sec_company c on c.id=e.company_id
LEFT JOIN sec_integral_log s on s.integral_id=t.id 
and s.change_time >='2018-07-01' and s.change_time<= '2018-08-31'
where e.id=1075 or e.id=1070
group by t.emp_id,weeks

实际结果:

图片说明

期望结果:

图片说明

新建了一张表,每月扫一次把上个月的数据存进去

用IFNULL格式化下weeks和count就行了。。

select e.id eid,e.name ename,c.name cname,
ifnull(DATE_FORMAT(s.change_time,'%Y-%m'),DATE_FORMAT(now(),'%Y-%m')) weeks,
ifnull(sum(s.intergral_num) ,0) count,
t.integral from sec_employee e
LEFT JOIN sec_integral_table t on e.id=t.emp_id
LEFT JOIN sec_company c on c.id=e.company_id
LEFT JOIN sec_integral_log s on s.integral_id=t.id
and s.change_time >='2018-07-01' and s.change_time<= '2018-08-31'
where e.id=1075 or e.id=1070
group by t.emp_id,weeks

ifnull(sum(s.intergral_num) ,0) count, 这有用 时间那个有问题

我的意思是无论有没有数据 如果查 两个月就每人显示两个月两条数据 查三个月就每人显示三条数据

时间筛选有问题DATE_FORMAT(s.change_time,'%Y-%m') 筛选的时候1075在sec_integral_log 表是没有数据的

使用交叉连接可以实现,即将人员数据和时间数据相乘得到固定的数据记录,在左连接其数据源表即可得到你想要的结果。

(select * from
(select id from sec_employee where id in ('1075','1070')) a
CROSS JOIN
(select DATE_FORMAT(s.change_time,'%Y-%m') weeks from sec_integral_log where change_time >='2018-07-01' and change_time<= '2018-08-31' group by weeks) b) cc
left join ......
left join ......