2013-02-20 17 views
-1

我想要的是,如果它返回多於1,然後刪除MAX([年])行,但返回其餘。這意味着如果交叉Applyselect返回4條記錄只返回3.如果3則返回2。如果2返回只有1。我認爲最好的方法是將逗號更改爲另一個字符(如#)。正確搜索#刪除一切正確的關注。如果我沒有使用交叉申請,我可能會有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)行,因爲它是學生的最新/當前學位信息。我只想要以前的學位,機構,年份不是最新的。也許一個右(RTRIM(最後一個逗號後的寄託都),但有以下數是SQL:使用XML路徑交叉應用(逗號劃定) - 刪除最大行,如果> 1

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 - 約翰·史密斯 - BA,MS,PHD - College1,Univ1,Univ2 - 1990,2003,2010

45 - 保羅瑞恩 - BA,MS - College15,Univ19 - - 1999,2008

134 - 辛迪·瓊斯 - BA - College56 - 1978年

我只想要回PRIOR度(S),機構(S),年(S)。 不是最新的。含義PersonID 18刪除PHd,Univ2,2010. PersonID 45刪除MS,Univ19,2008. PersonID 134離開原因僅爲1條記錄。

希望這是有道理的。提前致謝。

回答

0

如果我理解得很清楚,您想刪除每個CSV列的第一個值。爲什麼不這樣做:

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

希望這會有所幫助!

+0

你好,如果你看看底部產生的查詢。如果我沒有使用交叉應用,我將有3行PersonID 18: – sjackson5280 2013-02-20 19:05:35

+0

行(1)18 ----約翰史密斯---- BA ----大學1 --- 1990行(2)18 ---- John Smith --- MS ---- Univ1 ------ 2003 Row(3)18 ---- John Smith ---- BA ---- Univ2 ----- 2010。 ...我想刪除第(3)行,因爲它是學生的最新/當前學位信息。我只想要以前的學位,機構,年份不是最新的。如果添加了這個:'vw_deg_all LEFT JOIN Institution ON vw_deg_all.institutionID = institution.id and vw_deg_all。[year] sjackson5280 2013-02-20 19:50:31

+0

[年])' – HucKQC 2013-02-20 20:38:26