我想要的是如果它返回超过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 ....我想要删除Row(3)因为它是学生最新/当前学位信息。我只希望先前的学位,机构,年份不是现在的。也许是一个Right(rtrim(在最后一个逗号之后)但是必须计算下面是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 - FullName - 逗号学位 - CommInst - CommYear
18 - 约翰史密斯 - 文学学士,硕士,博士 - 大学1,大学1,大学 - 1990,2003,201045 - Paul Ryan - 学士,硕士 - College15,Univ19 - 1999,2008
134 - Cindy Jones - BA - College56 - 1978
我只想退回 PRIOR 学位,机构,年份。 不是最新的。含义PersonID 18删除PHd,Univ2,2010。PersonID 45删除MS,Univ19,2008。PersonID 134只保留1条记录。
希望这是有道理的。提前谢谢。
答案 0 :(得分:0)
如果我理解得很清楚,您想删除每个CSV列的第一个值。为什么不这样做:
DECLARE @Field as nvarchar(MAX)
SET @Field = 'College1, Univ1, Univ2'
SELECT Substring(@Field,PATINDEX('%,%',@Field)+1,LEN(@Field)-PATINDEX('%,%',@Field))
希望这有帮助!