#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. Вау! большое вам спасибо. Очень хорошо объяснено, и это сработало. Я действительно ценю это.