来看下这个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;
|