Mój scenariusz był nieco bardziej skomplikowany niż na przykładzie OP, więc pomyślałem, że podzielę się tym, aby pomóc innym, którzy mają podobne problemy. Musiałem pogrupować zamówienia sprzedaży według daty wykonania, podczas gdy zamówienia są przechowywane z datetime.
Tak więc w tabeli "dni" nie mogłem przechowywać jako datę z czasem "00: 00: 00.000" i uzyskać wszystkie dopasowania. Dlatego też zapisałem go jako ciąg znaków i próbowałem bezpośrednio dołączyć do skonwertowanej wartości.
To nie zwróciło żadnych zerowych rzędów, a rozwiązaniem było wykonanie pod-zapytania zwracającego datę już skonwertowaną na ciąg znaków.
Przykładowy kod w następujący sposób:
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
Przykładowe Wyniki:
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
Podpowiedź: numery (aka data) Tabela –