2015-09-13 27 views
2

我需要製作一個SQL函數,它將x列數和y行數組合到1列中,並用逗號分隔並按字母順序排序。用於將列組合爲一個的SQL函數

1   2   3   4 
A   B   C   D 
E   F   G   H 
I   J   K   L 

應該變成

1 
A,B,C,D 
E,F,G,H 
I,J,K,L 

我試圖尋找,但我無法找到任何解決方案,不包括列被硬編碼。

+4

爲什麼是一個問題 「欄目中被硬編碼」? –

+0

這是一個問題,因爲我有很多列,需要多次執行此操作。因此,每次寫入100列以上的功能都沒有趣:)​​ – TangoDurango

+0

所以使用SQL來生成SQL。你不能在一個函數中使用動態SQL,但你仍然可以在設計時對'sys.columns'執行查詢來生成所需的SQL。它將比通過XML往返更好。 –

回答

6

我不清楚爲什麼你想避免硬編碼列,但這個工程(based on idea here)。

SELECT SUBSTRING(concatenated, 2, 0 + 0x7FFFFFFF) 
FROM YourTable C 
     CROSS APPLY (SELECT ',' + t.c.value('.', 'NVARCHAR(128)') 
        FROM (SELECT (SELECT C.* 
            FOR XML RAW, TYPE) AS x)v 
          CROSS APPLY v.x.nodes('row/@*') AS t(c) 
        ORDER BY t.c.value('.', 'NVARCHAR(128)') 
        FOR XML PATH('')) CA(concatenated) 

SQL Fiddle

要還隔着行串聯,你可以使用

SELECT SUBSTRING(concatenated, 2, 0 + 0x7FFFFFFF) 
FROM (SELECT ',' + t.c.value('.', 'NVARCHAR(128)') 
     FROM (SELECT (SELECT * 
         FROM YourTable 
         FOR XML RAW, TYPE) AS x)v 
       CROSS APPLY v.x.nodes('row/@*') AS t(c) 
     ORDER BY t.c.value('.', 'NVARCHAR(128)') 
     FOR XML PATH('')) CA(concatenated) 
+0

如果答案需要在單行和單列中,那麼? –

+0

@Ajmot http://sqlfiddle.com/#!6/7be162/2 –

+0

添加[支持數字排序](http://sqlfiddle.com/#!6/8fcb3/1/0),它會工作完美;) – lad2025

0

給出的信息是不是sufficient.In事實,是不問question.You剛纔問一部分的方式問題在哪裏你被擊中。 在這種情況下,您也可以在沒有邏輯的情況下獲得解決方案。

你爲什麼在尋找那個輸出?

試試這個,

declare @t table(col1 varchar(50),col2 varchar(50), 
col3 varchar(50),col4 varchar(50)) 
insert into @t values ('1', '2' , '3' , '4') 
,('A' ,   'B' ,   'C' ,  'D') 
,('E' ,  'F' ,  'G' ,  'H') 
,('I' ,  'J' ,  'K'  , 'L') 



select col1 from @t where col1='1' 
union all 
select col1+','+col2+','+col3+','+col4 
from @t 
where col1<>'1'