来看下这个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` |
得到如下数据:
但是没有数据的部分就无法显示出来了。
如果要将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表所有的字段内容了。
这种方式适用于两个现有的表进行联合查询,但是有时候我们需要按日期进行分组。这个时候我们就需要创建个日期表了。
一个例子:
新建一个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; |