mysql group by 无数据补0 方法

本文介绍如何在SQL中处理分组查询时未出现的数据字段显示为0的问题。通过子查询与右连接的方式实现需求类型的完整显示,并给出具体SQL语句示例。此外,还提供了按日期分组查询时创建日期表的方法。

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

1
2
3
4
5
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语句如下:

1
2
3
4
5
6
7
8
9
SELECTtb_type.`type_id` , IF(countIS NULL , 0, countascount  ,
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`

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

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

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

然后,采用连接查询。

1
2
3
4
5
6
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
转载备注

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值