Мой сценарий был немного более сложным, чем пример OP, поэтому я поделился, чтобы помочь другим, у которых есть подобные проблемы. Мне нужно было сгруппировать заказы на продажу по дате, когда они были приняты, тогда как заказы хранятся с указанием даты и времени.
Таким образом, в таблице поиска "days" я не смог сохранить дату в формате '00: 00: 00.000' и получить совпадения. Поэтому я сохранил в виде строки, и я попытался присоединиться к преобразованному значению напрямую.
Это не вернуло никаких нулевых строк, и решением было сделать подзапрос, возвращающий дату, уже преобразованную в строку.
Пример кода:
declare @startDate datetime = convert(datetime,'09/02/2016')
declare @curDate datetime = @startDate
declare @endDate datetime = convert(datetime,'09/09/2016')
declare @dtFormat int = 102;
DECLARE @null_Date varchar(24) = '1970-01-01 00:00:00.000'
/* Initialize #days table */
select CONVERT(VARCHAR(24),@curDate, @dtFormat) as [Period] into #days
/* Populate dates into #days table */
while (@curDate < @endDate )
begin
set @curDate = dateadd(d, 1, @curDate)
insert into #days values (CONVERT(VARCHAR(24),@curDate, @dtFormat))
end
/* Outer aggregation query to group by order numbers */
select [Period], count(c)-case when sum(c)=0 then 1 else 0 end as [Orders],
sum(c) as [Lines] from
(
/* Inner aggregation query to sum by order lines */
select
[Period], sol.t_orno, count(*)-1 as c
from (
/* Inner query against source table with date converted */
select convert(varchar(24),t_dldt, @dtFormat) as [shipdt], t_orno
from salesorderlines where t_dldt > @startDate
) sol
right join #days on shipdt = #days.[Period]
group by [Period], sol.t_orno
) as t
group by Period
order by Period desc
drop table #days
Пример результатов:
Period Orders Lines
2016.09.09 388 422
2016.09.08 169 229
2016.09.07 1 1
2016.09.06 0 0
2016.09.05 0 0
2016.09.04 165 241
2016.09.03 0 0
2016.09.02 0 0