У меня есть таблица SQLite, которая содержит числовое поле field_name
. Мне нужно группировать по диапазонам этого столбца, что-то вроде этого: SELECT CAST(field_name/100 AS INT), COUNT(*) FROM table GROUP BY CAST(field_name/100 AS INT)
, но включая диапазоны, которые не имеют значения (COUNT для них должно быть 0
). И я не могу получить, как выполнить такой запрос?
Вы можете сделать это, используя соединение и (хотя kludgy) дополнительную таблицу.
Дополнительная таблица будет содержать каждое из значений, которые вы хотите использовать в ответе на запрос (это не только заполнило бы значения CAST(field_name/100 AS INT)
между вашими возвращаемыми значениями, но также позволило бы расширить его таким образом, чтобы если ваши текущие группы были 5, 6, 7, вы можете включить от 0 до 10.
В других вариантах SQL вы сможете вступать в правое соединение или полное внешнее соединение, и вы будете в пути. Увы, SQLite этого не предлагает.
Соответственно, мы будем использовать перекрестное соединение (присоединяем все ко всему), а затем фильтруем. Если у вас относительно небольшая база данных или небольшое количество групп, вы в хорошей форме. Если у вас их много, это будет очень интенсивный способ сделать это (результат перекрестного соединения будет содержать строки #ofRowsOfData * #ofGroups, поэтому не смотрите).
Пример:
TABLE: groups_for_report
desired_group
-------------
0
1
2
3
4
5
6
Таблица: данные
fieldname other_field
--------- -----------
250 somestuff
230 someotherstuff
600 stuff
вы должны использовать запрос типа
select groups_for_report.desired_group, count(data.fieldname)
from data
cross join groups_for_report
where CAST(fieldname/100.0 AS INT)=desired_group
group by desired_group;