2015-09-13 28 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'