Если у вас есть предопределенный список status
es, вы можете выполнить условное агрегирование:
select
date(mydate) days,
sum(status = 0) status_O,
sum(status = 1) status_1,
sum(status = 2) status_2,
sum(status = 3) status_3
from mytable
where mydate >= current_date - interval 30 day
group by days
В противном случае вам понадобится Dynami c SQL; то есть используйте запрос для генерации фактического запроса, а затем выполните его.
Для вашего варианта использования это должно выглядеть так:
set @sql = null;
select group_concat(
distinct concat('sum(status = ', status, ') as status_', status)
delimiter ', '
order by status
) into @sql
from mytable;
set @sql = concat('select date(mydate) days, ', @sql, ' from mytable group by days');
prepare stmt from @sql;
execute stmt;
deallocate prepate stmt;