问题:如何过滤结果(如下所示)以排除错误数据?我猜我的问题出在WHERE
子句中,但我一生都无法解决。
最终目标:为CDA_Orientation
和portfolio
表中不存在任何值的e_component
列返回NULL值(例如,员工尚未接受“入职培训” )
注意::伊士曼(Eastman),德卢卡(DeLuca)和方塔诺(Fontano)的入学日期是相同的日期,代表course_startdate
表的portfolio
列中的TOP 1结果。 / p>
如果我正确完成了 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 和警告。
谢谢!
答案 0 :(得分:1)
我相信加入是问题。如果您只是想为每个人获取记录,以这种方式使用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