-1

私が望むのは、それが1つ以上を返す場合、MAX([年]) 行を削除して残りを返すことです。つまり、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(最後のコンマの後のすべて) ですが、カウントする必要があります 以下は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 -- コンマ Degree -- CommInst -- CommYear

18 -- ジョン・スミス -- 学士号、修士号、博士号 -- 大学 1、大学 1、大学 2 -- 1990 年、2003 年、2010 年

45 -- ポール・ライアン -- 学士号、修士号 -- 大学 15、大学 19 -- 1999 年、2008 年

134 -- シンディ・ジョーンズ -- BA -- College56 -- 1978

の学位、機関、年のみを返したいです。最新ではありません。意味 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 に答える