2012-08-30 12 views
1

我正在嘗試使用for XML函數來轉發一些數據。我的數據如下:在T-sql中使用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 

目前我的成績並不比選擇兩個不同原始的領域。

此外,如果這不是達到我最終目標的最佳方法,我完全接受替代解決方案,這是我知道這樣做的唯一方法。

+0

您可能要添加'sql'和'SQL-server'標籤到你的問題來擴大觀衆。 –

回答

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 

希望這有助於

0

你意識到了CodePlex上有定義的聚集GROUP_CONCAT .Installation的用戶一個開放源碼的CLR實現就像在服務器上運行SQL腳本一樣簡單。

http://groupconcat.codeplex.com/

它有4 GROUP_CONCAT實施

  • GROUP_CONCAT --default分隔符爲,(逗號)

  • GROUP_CONCAT_D - 你可以指定分隔符

  • GROUP_CONCAT_DS - 您可以指定分隔符,排序順序(1 as asc order,2 as desc order)

  • GROUP_CONCAT_S - 你可以指定排序順序

在你的榜樣,你會使用這樣

SELECT VenNum_A   
     ,dbo.GROUP_CONCAT(VenNum_B) AS VenNum_B   
FROM YourTable 
GROUP BY 
    VenNum_A