MySQL несколько подсчетов на запрос - PullRequest
1 голос
/ 08 мая 2020

У меня есть таблица с 2 полями: статус и дата и время. Я хочу подсчитать каждый тип статуса.

Моя таблица:

datetime, status set(0,1,2,3)

мой запрос:

select date_format(mydate,'%d-%m') as days, count(*) as total, status from mytable where mydate >= date_sub(curdate(), interval 30 day) group by days, status ORDER BY days DESC

Что возвращает мой запрос:

07/05/2020 1234 0
07/05/2020 8277 1
07/05/2020 2343 2
07/05/2020 9827 3

Что хочу:

07/05/2020 1234 8277 2343 9827
06/05/2020 .... .... ... ...
05/05/2020 . . . .

1 Ответ

0 голосов
/ 08 мая 2020

Если у вас есть предопределенный список 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;
...