我想要的是如果它返回超过 1 然后删除MAX([year]) 行但返回其余的。这意味着如果 Cross Applyselect 返回 4 条记录,则仅返回 3。如果 3,则仅返回 2。如果 2,则仅返回 1。我相信最好的方法是将逗号更改为另一个字符(例如 #)。右搜索 # 删除所有内容 右下。如果我不使用 Cross Apply,我可能会有 3 行 Row(1)18 ----John Smith ---- BA ---- College1 --- 1990 Row(2) 18----John Smith ---MS---- Univ1-----2003 Row(3)18----John Smith ----BA ----Univ2 -----2010....我想删除第 (3) 行,因为它是学生最新/当前的学位信息。我只想要之前的学位、机构、年份而不是当前的。也许是 Right(rtrim(everthing after last comma) 但必须计数 下面是 SQL:
SELECT
DISTINCT
vw_name.personID AS personID,
vw_name.FullName AS FullName,
(CASE WHEN LEN(commaDegree) <= 2 THEN commaDegree ELSE LEFT(commaDegree,
LEN(commaDegree) - 1) END) AS commaDegree,
(CASE WHEN LEN(commaInst) <= 2 THEN commaInst ELSE LEFT(commaInst, LEN(commaInst) - 1) END)
AS commaInst,
(CASE WHEN LEN(commaYear) <= 2 THEN commaYear ELSE LEFT(commaYear, LEN(commaYear) - 1) END)
AS commaYear
FROM vw_name LEFT JOIN
vw_deg_all ON
vw_deg_all.personID = vw_name.personID
CROSS
APPLY
(SELECT isnull(degree.degree + N', ', N'')
FROM vw_deg_all LEFT JOIN
degree ON vw_deg_all.degreeID = degree.id
WHERE vw_deg_all.personID = vw_name.personID
ORDER BY vw_deg_all.[year] ASC FOR XML PATH('')) AS t (commaDegree)
CROSS APPLY
(SELECT isnull(institution.inst + N', ', N'')
FROM vw_deg_all LEFT JOIN
institution ON vw_deg_all.institutionID = institution.id
WHERE vw_deg_all.personID = vw_name.personID
ORDER BY vw_deg_all.[year] ASC FOR XML PATH('')) AS u(commaInst)
CROSS APPLY
(SELECT isnull(CONVERT(nvarchar, vw_deg_all.[year]) + N', ', N'')
FROM vw_deg_all
WHERE vw_deg_all.personID = vw_name.personID
ORDER BY vw_deg_all.[year] ASC FOR XML PATH('')) AS v(commaYear)
结果查询
PersonID -- 全名 -- 逗号学位 -- CommInst -- CommYear
18 -- John Smith -- 学士、硕士、博士 -- College1、Univ1、Univ2 -- 1990、2003、2010
45 -- Paul Ryan -- 学士、硕士 -- College15、Univ19 -- 1999、2008
134 -- 辛迪·琼斯 -- 文学学士 -- College56 -- 1978
我只想返回PRIOR学位、机构、年份。不是最新的。含义 PersonID 18 删除 PHd,Univ2,2010。PersonID 45 删除 MS,Univ19,2008。PersonID 134 保留原样,因为只有 1 条记录。
希望这是有道理的。提前致谢。