1

我有以下 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 的书籍数量,第二行表示 BOOK_STATUS_FK <= 4 的书籍数量

有没有办法在sql中做到这一点?

感谢您的建议。

4

3 回答 3

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)
于 2013-01-30T14:49:38.777 回答
2

当计数之一为 0 时,Gordon Linoff 建议的 2 行解决方案不会产生 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 的

于 2013-01-30T14:52:18.770 回答
2

如果您总是需要两行,即使一个组的计数为 0,您也可以使用回文的解决方案,或者您可以使用 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
于 2013-01-30T15:11:21.737 回答