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 行にグループ化したいのですが、1 行は BOOK_STATUS_FK > 4 の書籍数を表し、2 行目は BOOK_STATUS_FK <= 4 の書籍数を表します

SQLでそれを行う方法はありますか?

ご提案いただきありがとうございます。

4

3 に答える 3

2

カウントの 1 つが 0 の場合、Gordon Linoff が提案する 2 行のソリューションは 2 行を生成しません。

以下は、両方のカウントを 1 つの行に表示します。

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

これは、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 であっても、常に 2 行が必要な場合は、回文のソリューションを使用するか、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 に答える