mysql group by 无数据补0 方法

来源:互联网 发布:java的方法的重载 编辑:程序博客网 时间:2024/04/29 13:25

来看下这个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(countISNULL , 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你的表 GROUPBYperWeek) indTable 
 
RIGHTJOINweek 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 bLEFT JOIN (SELECT count(*) co,a.team_id FROM member_team a GROUP BY a.team_id) c ON b.id = c.team_id
转载备注

0 0
原创粉丝点击