Фильтрация SELECT TOP WITH TIES, если для определенного столбца нет записей - PullRequest
0 голосов
/ 28 ноября 2018

Вопрос: Как я могу отфильтровать результаты (см. Ниже), чтобы исключить ошибочные данные?Я предполагаю, что моя проблема где-то в предложении WHERE, но я не могу это понять.

Конечная цель: Вернуть значения NULL для *Столбец 1008 *, в котором отсутствуют значения в таблицах portfolio и e_component (например, у сотрудника еще нет ориентации)

Схема БД: Database Schema

Результирующий набор с ошибками: Results with Errors

ПРИМЕЧАНИЕ: Даты ориентации для Eastman, DeLuca и Fontanoявляются одной и той же датой и представляют результат ТОП 1 из столбца course_startdate таблицы portfolio.

То, что я хочу, чтобы результаты выглядели так: Desired Result Set

Если я правильно выполнил 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 и предостережения.

Заранее спасибо!

1 Ответ

0 голосов
/ 28 ноября 2018

Я полагаю, что соединения - это проблема.Использование WITH TIES таким способом также сбивает с толку, если вы просто пытаетесь получить запись для каждого человека;Я бы использовал GROUP BY.Если вы хотите сделать это без подзапроса, вы можете сделать:

SELECT
    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,
    MAX(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 
    JOIN @e_component EC 
    ON PO.component_id=EC.component_id
        AND EC.userdefined_id LIKE '000150%' 
        AND PO.status=11)
ON P.person_id=PO.person_id
WHERE (cdai_exp_date IS NOT NULL OR cdap_exp_date IS NOT NULL)
GROUP BY P.lastname, P.firstname, P.person_id,PC.CDAI_EXP_DATE,PC.CDAP_EXP_DATE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...