2014-12-13 3 views
0

Я хочу объединить подсчеты, сгруппированные по дате и столбцу.SQL GROUP BY (DATEPART(), field1) result set to zero nulls

Например, таблица с 3-мя колоннами с каждой строки, представляющей собой уникальное событие: идентификатор, имя, дата

Я хочу, чтобы выбрать относительно общего количества сгруппированных по имени и час, с нулями, когда нет никаких событий. Если я только группируюсь по имени, я могу присоединиться к нему с таблицей каждого имени. Через час я мог бы сделать что-то подобное.

Как бы я обработал случай группировки обоими без таблицы со строкой для каждого имени + комбинацию часов?

+0

CROSS JOIN таблицу, содержащую каждое имя с таблицей, содержащей каждый час, затем OUTER ПРИСОЕДИНЯЙТЕСЬ, что с вашими данными и совокупностью. – mdahlman

+0

Какая СУБД вы используете? – paqogomez

ответ

0

Следующее является MySQL решения:

create table hours (hour int) 

insert hours (hour) values (0), (1) .... (23) 

select hour, name, sum(case when name is null then 0 else 1 end) 
from hours left outer join 
event on (hour(event.date) = hours.hour) 
group by hour, name 

сумма (случай, когда имя является нуль, то 0 еще 1 конец) обрабатывает случай, когда нет никаких событий для конкретного часа и имени. счет будет отображаться как 0. Для других каждая соответствующая строка вносит 1 в сумму.

Для сервера sql вместо этого используйте datepart (hour, event.date). Остальные должны быть похожи

0

Вы можете использовать cross join для получения всех строк, а затем другая логика для заполнения значений:

select h.hour, n.name, count(a.name) as cnt 
from (select distinct hour(date) as hour from atable) h cross join 
    (select distinct name from atable) n left join 
    atable a 
    on hour(a.date) = h.hour and a.name = n.name 
group by h.hour, n.name;