一、需求
二、构建SQL
思路:
- 对数据进行group by 分组
```sql
SELECTCOUNT( 1 ) AS countNumber,DATE_FORMAT( init_time, '%Y-%m-%d' ) AS dateTimeFROMcameraWHEREdel_flag = 0AND init_time <![CDATA[>=]]> date_add( curdate(), INTERVAL - DAY ( curdate())+ 1 DAY )AND last_day(curdate())GROUP BY# 根据天数分组,但是如果某天没有数据,那么这天的数据就不存在,但是显示需要为空DATE_FORMAT( init_time, '%Y-%m-%d' )
- 和当前月天数进行连接```sql# 单独获得本月所有天数,用于表的连结SELECTADDDATE( y.FIRST, x.date - 1 ) AS dFROM(SELECT1 AS date UNION ALLSELECT2 UNION ALLSELECT3 UNION ALLSELECT4 UNION ALLSELECT5 UNION ALLSELECT6 UNION ALLSELECT7 UNION ALLSELECT8 UNION ALLSELECT9 UNION ALLSELECT10 UNION ALLSELECT11 UNION ALLSELECT12 UNION ALLSELECT13 UNION ALLSELECT14 UNION ALLSELECT15 UNION ALLSELECT16 UNION ALLSELECT17 UNION ALLSELECT18 UNION ALLSELECT19 UNION ALLSELECT20 UNION ALLSELECT21 UNION ALLSELECT22 UNION ALLSELECT23 UNION ALLSELECT24 UNION ALLSELECT25 UNION ALLSELECT26 UNION ALLSELECT27 UNION ALLSELECT28 UNION ALLSELECT29 UNION ALLSELECT30 UNION ALLSELECT31) x,( SELECT CURDATE() - INTERVAL DAY ( CURDATE()) - 1 DAY AS FIRST, DAY ( LAST_DAY( CURDATE())) AS last ) yWHEREx.date <=y.last) AS tempDate
整合起来
SELECTIFNULL(countNumber,0) as counts,dFROM(SELECTCOUNT( 1 ) AS countNumber,DATE_FORMAT( init_time, '%Y-%m-%d' ) AS dateTimeFROMcameraWHEREdel_flag = 0AND init_time <![CDATA[>=]]> date_add( curdate(), INTERVAL - DAY ( curdate())+ 1 DAY )AND last_day(curdate())GROUP BYDATE_FORMAT( init_time, '%Y-%m-%d' )) AS temp1RIGHT JOIN (SELECTADDDATE( y.FIRST, x.date - 1 ) AS dFROM(SELECT1 AS date UNION ALLSELECT2 UNION ALLSELECT3 UNION ALLSELECT4 UNION ALLSELECT5 UNION ALLSELECT6 UNION ALLSELECT7 UNION ALLSELECT8 UNION ALLSELECT9 UNION ALLSELECT10 UNION ALLSELECT11 UNION ALLSELECT12 UNION ALLSELECT13 UNION ALLSELECT14 UNION ALLSELECT15 UNION ALLSELECT16 UNION ALLSELECT17 UNION ALLSELECT18 UNION ALLSELECT19 UNION ALLSELECT20 UNION ALLSELECT21 UNION ALLSELECT22 UNION ALLSELECT23 UNION ALLSELECT24 UNION ALLSELECT25 UNION ALLSELECT26 UNION ALLSELECT27 UNION ALLSELECT28 UNION ALLSELECT29 UNION ALLSELECT30 UNION ALLSELECT31) x,( SELECT CURDATE() - INTERVAL DAY ( CURDATE()) - 1 DAY AS FIRST, DAY ( LAST_DAY( CURDATE())) AS last ) yWHEREx.date <=y.last) AS tempDateON tempDate.d = temp1.dateTimeORDER BY tempDate.d
结果如下:

三、总结分析
- 在百度过程中,发现一种写法:@data:….只是定义了变量,方便在其他地方引用,在sql中也可以直接使用。 ~~这难道不是函数 ?并不是。。 ~~

