我有以下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中执行此操作?
感谢您的建议。
答案 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