1

for XML 関数を使用して一部のデータをピボットしようとしています。私のデータは次のとおりです。

VenNum_A   VenNum_B
0001       0002
0001       0003
0001       0004
0005       0006
0005       0007
0005       0008

私は次の結果を得ようとしています:

venNum_A   VenNum_B
0001       0002,0003,0004
0005       0006,0007,0008

これまでの私のコード:

; with t as
        (
        select Distinct 
            A_VenNum, B_VenNum, SUM(1) as Cnt
        From 
            #VenDups_Addr
        Group by 
            A_VenNum, B_VenNum
        )
        select distinct
            B_Vennum,
             A_Vennum =cast(substring((
            select distinct 
                  [text()] =  ', ' + t1.A_Vennum 
            from 
                  t as t1
            where 
                t.A_Vennum =t1.A_VenNum
            for XML path('')
                ),3,99) as Varchar(254))

        From t  

現在、私の結果は、両方の元のフィールドを選択するのと同じです。

また、これが最終目標を達成するための最良の方法ではない場合、私は別の解決策を完全に受け入れています。これが私が知っている唯一の方法です.

4

2 に答える 2

3

試す

Declare @t table(VenNum_A VARCHAR(10),   VenNum_B VARCHAR(10))
Insert Into @t 
Select '0001','0002' Union All Select '0001','0003' Union All Select '0001','0004' Union All 
Select '0005','0006' Union All Select '0005','0007' Union All Select '0005','0008'

SELECT 
    VenNum_A
    ,VenNum_B = STUFF((Select ',' + CAST(VenNum_B AS VARCHAR(1000)) 
      FROM  @t t2 
      WHERE t1.VenNum_A = t2.VenNum_A
      FOR XML PATh ('')
      ),1,1,'')
FROM @t t1
GROUP BY t1.VenNum_A

//結果

VenNum_A    VenNum_B
0001    0002,0003,0004
0005    0006,0007,0008

お役に立てれば

于 2012-08-31T04:49:13.657 に答える
0

CodePlexには、ユーザー定義の集計GROUP_CONCATのオープンソースCLR実装があることをご存知ですか。インストールは、サーバーでSQLスクリプトを実行するのと同じくらい簡単です。

http://groupconcat.codeplex.com/

4つのgroup_concat実装があります

  • GROUP_CONCAT --デフォルトの区切り文字は、(コンマ)

  • GROUP_CONCAT_D-区切り文字を指定できます

  • GROUP_CONCAT_DS-区切り文字、並べ替え順序を指定できます(1は昇順、2は降順)

  • GROUP_CONCAT_S-並べ替え順序を指定できます

あなたの例では、このように使用します

SELECT  VenNum_A        
       ,dbo.GROUP_CONCAT(VenNum_B) AS VenNum_B        
FROM YourTable
GROUP BY
    VenNum_A
于 2012-09-02T19:36:04.243 に答える