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

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

1
2
3
4
5
6
7
8
9
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

然后,采用连接查询。

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

Logo

更多推荐