-1

我想要的是如果它返回超过 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 条记录。

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

4

1 回答 1

0

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

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

希望这可以帮助!

于 2013-02-20T18:58:49.747 回答