Внешняя объединенная строка имеет пустые значения в столбцах, в которых нет соответствующей строки. Таким образом, это
where fc.[Id_Centre]='01415' and fc.Date_Ctl between 20200501 and 20200520
удалит все внешние соединенные f c строки.
Это
where dd.DateKey is null
, с другой стороны, удалит все не внешние соединенные dd rows.
Более того, почему полное внешнее соединение? Разве таблица дат не должна содержать все даты? Кажется, вам нужно простое левое внешнее соединение:
select
dd.datekey,
sum(fc.no_controls) as total_controls
from dm.dim_date dd
left join fact_controls fc on fc.date_ctl = dd.datekey and fc.id_centre = '01415'
where dd.datekey between '20200501' and '20200520'
group by dd.datekey
order by dd.datekey;
Или (агрегация перед соединением):
select dd.datekey, fc.total_controls
from dm.dim_date dd
left join
(
select date_ctl, sum(no_controls) as total_controls
from fact_controls
where id_centre = '01415'
group by date_ctl
) fc on fc.date_ctl = dd.datekey
where dd.datekey between '20200501' and '20200520'
order by dd.datekey;
Или (агрегация непосредственно по строке даты):
select dd.datekey, fc.total_controls
from dm.dim_date dd
outer apply
(
select sum(no_controls) as total_controls
from fact_controls
where id_centre = '01415'
and by date_ctl = dd.datekey
) fc
where dd.datekey between '20200501' and '20200520'
order by dd.datekey;
Вы можете использовать coalesce, чтобы преобразовать нули в нули в ваших результатах.
Если datekey
+ id_centre
уникальны в вашей таблице fact_controls
вам не нужно агрегирование (SUM
) в все конечно.