Вопрос: Как я могу отфильтровать результаты (см. Ниже), чтобы исключить ошибочные данные?Я предполагаю, что моя проблема где-то в предложении WHERE
, но я не могу это понять.
Конечная цель: Вернуть значения NULL для *Столбец 1008 *, в котором отсутствуют значения в таблицах portfolio
и e_component
(например, у сотрудника еще нет ориентации)
Схема БД: ![Database Schema](https://i.stack.imgur.com/pVssp.png)
Результирующий набор с ошибками: ![Results with Errors](https://i.stack.imgur.com/3oRto.png)
ПРИМЕЧАНИЕ: Даты ориентации для Eastman, DeLuca и Fontanoявляются одной и той же датой и представляют результат ТОП 1 из столбца course_startdate
таблицы portfolio
.
То, что я хочу, чтобы результаты выглядели так: ![Desired Result Set](https://i.stack.imgur.com/J9yGa.png)
Если я правильно выполнил JOINS , в столбце CDA_Orientation
должно появиться NULL , поскольку в таблице portfolio
нет записи (и, соответственно, таблица e_component
) для этих трех лиц.Запись только создается внешним интерфейсом , когда сотрудник назначен для курса.
Вот мой код:
SELECT TOP (1) WITH TIES
P.lastname+', '+P.firstname AS Employee,
P.person_id,
CONVERT(DATE,PC.CDAI_EXP_DATE) AS CDA_Infant,
CONVERT(DATE,PC.CDAP_EXP_DATE) AS CDA_Preschool,
CONVERT(DATE,PO.course_startdate) AS CDA_Orientation
FROM person P
JOIN person_custom PC ON PC.person_id=P.person_id
LEFT JOIN portfolio PO ON P.person_id=PO.person_id
FULL JOIN e_component EC ON PO.component_id=EC.component_id
WHERE (cdai_exp_date IS NOT NULL OR cdap_exp_date IS NOT NULL)
AND PO.course_startdate IN (SELECT course_startdate
FROM portfolio PO
LEFT JOIN e_component EC ON PO.component_id=EC.component_id
WHERE (EC.userdefined_id LIKE '000150%' AND PO.status=11))
ORDER BY ROW_NUMBER() OVER(PARTITION BY P.lastname+', '+P.firstname
ORDER BY PO.person_id)
ПРИМЕЧАНИЕ: TOP (1) WITH TIES
успешно извлек самую последнюю дату ориентации (у сотрудников может быть больше одной) из таблицы portfolio
для Tarkin и Rust.Я вырезал все ненужные JOINS и предостережения.
Заранее спасибо!