@aLap

Возможно ли сделать нулевой count при использовании GROUP BY?

Приветствую!

Допустим, делаю следующий запрос:

SELECT
    DATE(date_field),
    count(*),
    person
FROM
    some_table
GROUP BY
    date_field, person


Если на одну из дат записей с каким-то person нет, то, соответственно, строки с соотношением date_field - person - count тоже нет. Возможно ли как-то сделать, чтобы эта строка появлялась с count = 0?

Спасибо!
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
1. нужна таблица - календарь, либо сгенерированный набор дат
2. либо к календарю надо сделать left join вашей таблицы, либо к вашей таблице надо сделать right join календаря.

SQL join в примерах с описанием

в результате получится:

select cal.cal_date, count(person)
  from some_table st
  right join (
  -- генерируем календарь - набор дат
    select *
      from (
        select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) cal_date
          from
            (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
            (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
            (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
            (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
            (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4
      ) v
      where cal_date between '2021-11-01' and '2021-11-30'
  ) cal on cal.cal_date = st.date_field
  group by cal.cal_date


в MariaDB есть Sequence Storage Engine, но до MariaDB 10.0 , он поставлялся в виде динамической плагина, начиная с MariaDB 10.1 , движок Sequence устанавливается по умолчанию. Используя его можно генерировать список дат (календарь) следующим образом:

SELECT '2021-11-01' + INTERVAL seq DAY FROM seq_0_to_29;


а запрос будет соответственно:

select cal.cal_date, count(person)
  from some_table st
  right join (
  -- генерируем календарь - набор дат
    SELECT '2021-11-01' + INTERVAL seq DAY as cal_date FROM seq_0_to_29
  ) cal on cal.cal_date = st.date_field
  group by cal.cal_date
;


см. пример работы на dbfiddle.uk

и если person добавить в группировку - пример
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы