Я хочу создать график для моего набора данных за последние 24 часа.SQL Count с нулевыми значениями
Я нашел решение, которое работает, но это очень плохо, поскольку таблица, в которой я являюсь внешним, объединяет каждую отдельную строку в БД, так как я использую (теперь устаревший) параметр «все» в группе.
Вот решение, которое в настоящее время относится к работам. Сначала я объявляю интервалы между датами, которые с этого момента возвращаются 24 часа назад. Я объявляю это дважды, поэтому я могу использовать его позже и в процедуре.
Declare @StartDate datetime = dateadd(hour, -24, getdate())
Declare @StartDateProc datetime = dateadd(hour, -24, getdate())
Declare @EndDate datetime = getdate()
Я заполняю даты в таблице темп, включая специальную форматированную datetsring.
create table #tempTable
(
Date datetime,
DateString varchar(11)
)
while @StartDate <= @EndDate
begin
insert into #tempTable (Date, DateString)
values (@StartDate, convert(varchar(8), @StartDate, 5) + '-' + convert(varchar(2), @StartDate, 108));
SET @StartDate = dateadd(hour,1, @StartDate);
end
Это дает мне данные, выглядит следующим образом:
Date DateString
---------------------------------------------
2015-12-09 13:59:01.970 09-12-15-13
2015-12-09 14:59:01.970 09-12-15-14
2015-12-09 15:59:01.970 09-12-15-15
2015-12-09 16:59:01.970 09-12-15-16
Так что я хочу, чтобы присоединиться к моему набору данных на строке даты согласования и показать дату, даже если совпадающие строки равны нуль.
Здесь пока остальная часть запроса
select
Date = c.Date,
Amount = sum(c.Amount)
from
DbTable a
outer apply
(select
Date = b.DateString,
Amount = count(*)
from
#tempTable b
where
convert(varchar(8), a.DateColumn, 5) + '-' + convert(varchar(2), a.DateColumn, 108) = b.DateString
group by all
b.DateString) c
where
a.SomeParameter = 'test' and
a.DateColumn >= @StartDateProc and
a.DateColumn <= @EndDate
group by
c.Date
drop table #tempTable
тест, чтобы показать фактические данные:
Declare @StartDate datetime = dateadd(hour, -24, getdate())
Declare @EndDate datetime = getdate()
select
dateString = convert(varchar(8),a.DateColumn,5) + '-' + convert(varchar(2),a.DateColumn, 108),
Amount = COUNT(*)
from
DbTable a
where
a.someParameter = 'test' and
a.DateColumn>= dateadd(hour, -24, getdate()) and
a.DateColumn<= getdate()
group by
convert(varchar(8),a.DateColumn,5) + '-' + convert(varchar(2),a.DateColumn, 108)
Первые выходные строки:
dateString Amount
09-12-15-14 1
09-12-15-15 1
09-12-15-16 1
09-12-15-17 3
09-12-15-18 1
09-12-15-22 3
09-12-15-23 2
Как вы можете видеть, здесь нет данные за период с 19.00 до 21.00. Это, как я хочу, чтобы данные, которые будут отображаться:
dateString Amount
09-12-15-14 1
09-12-15-15 1
09-12-15-16 1
09-12-15-17 3
09-12-15-18 1
09-12-15-19 0
09-12-15-20 0
09-12-15-21 0
09-12-15-22 3
09-12-15-23 2
Результат набор с одной стороны от объединения, даже если другая сторона не там звучит как LEFT JOIN –
Попытался заставить его работать с левым соединением, но я не могу заставить его показать значения 0. – stibay
Wow, 'group by all' - Я этого раньше не видел. Корпорация Майкрософт рекомендует не использовать эту функцию, она устарела. –