select batch
, count(case when status=1 then 1 end) status1
, count(case when status=2 then 1 end) status2
, count(case when status=3 then 1 end) status3
from table
group by batch;
Đây thường được gọi là truy vấn "pivot" và tôi đã viết một bài viết về cách tạo động các truy vấn này trên blog của tôi .
Phiên bản sử dụng DECODE (dành riêng cho Oracle nhưng ít dài dòng hơn):
select batch
, count(decode(status,1,1)) status1
, count(decode(status,2,1)) status2
, count(decode(status,3,1)) status3
from table
group by batch;