分组结果集 - mysql

时间:2013-01-30 14:48:02

标签: mysql sql

我有以下sql,它返回按状态分组的书籍总数

    select COUNT(BOOK_ID) AS book_num, BOOK_STATUS_FK from BOOKS group by BOOK_STATUS_FK;

+---------+------------------+
| book_num | BOOK_STATUS_FK |
+---------+------------------+
|      57 |                2 |
|     162 |                3 |
|    9736 |                4 |
|     104 |                5 |
|      29 |               22 |
|       1 |               23 |
|       5 |               25 |
|      14 |               54 |
+---------+------------------+

我想将结果集分组为2行,其中一行代表BOOK_STATUS_FK>的书籍数量。 4和2代表BOOK_STATUS_FK< = 4

的书籍数量

有没有办法在sql中执行此操作?

感谢您的建议。

3 个答案:

答案 0 :(得分:2)

这是一个带有case语句的聚合:

select (case when book_tatus_fk > 4 then '>4' else '<=4' end) as grp, count(*)
from books
group by (case when book_tatus_fk > 4 then '>4' else '<=4' end)

答案 1 :(得分:2)

第2行解决方案Gordon Linoff建议,当其中一个计数为0时,不会产生2行。

以下将在一行中给出两个计数:

select ifnull( sum( if( book_status_fk > 4, 1, 0 ) ), 0), ifnull( sum( if( book_status_fk <= 4, 1, 0 ) ), 0 )
from books

编辑:添加了ifnull的

答案 2 :(得分:2)

如果你总是需要两行,即使一个组的数量是0,你可以使用palindrom的解决方案,或者你可以使用这个稍微修改过的版本的Gordon Linoff的查询:

select grp.g, count(BOOK_STATUS_FK)
from
  (select '<=4' g union all select '>4') grp left join books
  on grp.g = case when book_status_fk > 4 then '>4' else '<=4' end
group by grp.g