使用XML路径交叉应用(逗号描述) - 如果>删除最大行1

时间:2013-02-20 18:16:18

标签: xml tsql max cross-apply

我想要的是如果它返回超过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,2010

45 - 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条记录。

希望这是有道理的。提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果我理解得很清楚,您想删除每个CSV列的第一个值。为什么不这样做:

DECLARE @Field as nvarchar(MAX)
SET @Field = 'College1, Univ1, Univ2'
SELECT Substring(@Field,PATINDEX('%,%',@Field)+1,LEN(@Field)-PATINDEX('%,%',@Field))

希望这有帮助!