mysql group by 无数据补0 方法

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

SELECT `require_type_id` , COUNT(  `require_id` ) AScount,
SUM(  `require_final_cost` ) ASprice
FROM `tb_require`
WHEREDATE_FORMAT(  `require_start_date` ,  '%Y-%m') = DATE_FORMAT(  '2012-10-1',  '%Y-%m')
GROUPBY  `require_type_id`
1

得到如下数据:

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

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

改造的sql语句如下:

SELECTtb_type.`type_id` , IF(countIS NULL , 0, count) ascount  ,
IF(price ISNULL , 0, price) asprice
FROM
(select`require_type_id`,count(`require_id`) ascount  ,
sum(`require_final_cost`) asprice
FROMtb_require
wheredate_format(`require_start_date`,'%Y-%m')=  date_format('2012-10-1','%Y-%m')
GROUPBY `require_type_id`) indTable
RIGHTJOIN `tb_type` onindTable.`require_type_id` = `tb_type`.`type_id`
2

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

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

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

然后,采用连接查询。

SELECTweek.id , IF(amount ISNULL , 0, amount)
 
FROM
(SELECTWEEKOFYEAR(时间) AsperWeek  ,SUM(数量) ASamount FROM你的表 GROUPBY perWeek) indTable 
 
RIGHTJOIN week onindTable.perWeek = week.id;

除了if也可以用case then.

SELECT  CASE when c.co IS NULL then 0 else c.co END count,b.id,b.contact_name,b.team_name FROM team b
LEFT JOIN (SELECT count(*) co,a.team_id FROM member_team a GROUP BY a.team_id) c ON b.id = c.team_id

发表评论

电子邮件地址不会被公开。 必填项已用*标注