来看下这个SQL,这个SQL的意思是获取需求ID的数量及需求价格 并按需求类型分组显示。

SELECT  `require_type_id` , COUNT(  `require_id` ) AS count, 
SUM(  `require_final_cost` ) AS price
FROM  `tb_require`
WHERE DATE_FORMAT(  `require_start_date` ,  '%Y-%m' ) = DATE_FORMAT(  '2012-10-1',  '%Y-%m' )
GROUP BY  `require_type_id`

得到如下数据:
1

但是没有数据的部分就无法显示出来了。

如果要将group by的数据显示完整,没有数据的字段显示0,可以使用子查询和 右连接查询。

改造的sql语句如下:

SELECT tb_type.`type_id` , IF(count IS NULL , 0, count) as count  ,
IF(price IS NULL , 0, price) as price
FROM
(select `require_type_id`,count(`require_id`) as count  ,
sum(`require_final_cost`) as price 
FROM tb_require
where date_format(`require_start_date`,'%Y-%m')=  date_format('2012-10-1','%Y-%m')
GROUP BY `require_type_id`) indTable
RIGHT JOIN `tb_type` on indTable.`require_type_id` = `tb_type`.`type_id`

这样得到的数据则包含tb_type表所有的字段内容了。
2

这种方式适用于两个现有的表进行联合查询,但是有时候我们需要按日期进行分组。这个时候我们就需要创建个日期表了。
一个例子:

新建一个week表 week(id) 就是1-53

然后,采用连接查询。

SELECT week.id , IF(amount IS NULL , 0, amount) 

FROM 
(SELECT WEEKOFYEAR(时间) As perWeek  ,SUM(数量) AS amount FROM 你的表 GROUP BY perWeek) indTable  

RIGHT JOIN week on indTable.perWeek = week.id;

One thought on “mysql group by 无数据补0 方法

Leave a reply

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

required