Соединение DimDate с другой таблицей

#sql

#sql

Вопрос:

У меня есть таблица DimDate, которую я хочу присоединить к другой таблице с датами, когда имели место различные посещения. Я следил за многими потоками здесь, но я не могу заставить отсутствующие даты отображаться в моем результирующем наборе. Прилагается скриншот моей таблицы DimDate, а ниже приведен сценарий. У меня есть две версии, в которых таблица Dimdate является основной таблицей, а другая версия с ней — как левое соединение с другой таблицей, и ни одна из них не приводит к отсутствующим датам в моем результирующем наборе. По сути, я пытаюсь просмотреть все месяцы и заполнить значение NULL, если в моей другой таблице нет записей.

   SELECT  
  month(d.date) as 'DimDateMonth'
   ,month(s.date) as 'ActivityMonth'
  ,year(d.date) as 'DimDateYear'
  ,[PCN]
  ,[Type of Visit]
  ,[Pharmacist]
  ,[Practice]
  ,count(distinct(cast(s.Date as date))) 'Number of visits'
  FROM [dbo].[DimDate] as d 
left join [dbo].[mytable] s on  month(d.date)  = month(s.date) and year(s.date)  =               year(d.date)

where s.Pharmacist = 'abc' and year(d.date) = '2020'

  group by 
   month(d.date)
    ,month(s.date)
  ,year(d.date) 
  ,[PCN]
  ,[Type of Visit]
  ,[Pharmacist]
  ,[Practice]
 

введите описание изображения здесь

Ответ №1:

Фильтры для второй таблицы в a LEFT JOIN должны быть в ON предложении:

 FROM [dbo].[DimDate] d LEFT JOIN
     [dbo].[mytable] s 
     ON month(d.date) = month(s.date) AND
        year(s.date)  = year(d.date) AND
        s.Pharmacist = 'abc' 
WHERE year(d.date) = '2020'
 

Помещение s.Pharmacist = 'abc' в WHERE предложение отфильтровывает NULL значения, что отменяет LEFT JOIN .

Обратите внимание, что условия в первой таблице все равно должны быть включены в WHERE предложение, чтобы строки действительно были отфильтрованы.

Я бы также рекомендовал написать WHERE предложение как:

 WHERE d.date >= '2020-01-01' AND
      d.date < '2021-01-01'
 

Это позволяет использовать запрос и индексировать (date) его для фильтрации.

Комментарии:

1. Вау! большое вам спасибо. Очень хорошо объяснено, и это сработало. Я действительно ценю это.