在SQLServer2008中,如何将每三行合并为一列?
上面是我的一个示例表,我想根据NOOfDays合并每两行 预期产出:在SQLServer2008中,如何将每三行合并为一列?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,上面是我的一个示例表,我想根据NOOfDays合并每两行 预期产出: NOOfDays DISTRInutorID ------------------------- 1 abcd 1 cdef 2 DFSDF 2 SFSDD 2 SDFSD 2 WAOYWAR 7 WEFIWE 7
NOOfDays DISTRInutorID
-------------------------
1 abcd
1 cdef
2 DFSDF
2 SFSDD
2 SDFSD
2 WAOYWAR
7 WEFIWE
7 WEOFYWE
7 WFYREU
在SQL Server的古代版本中,逻辑如下所示:
NOOfDays DiSTRInutorID
------------------------------
1 abcd, cdef
2 DFSDF, SFSDD
2 SDFSD, WAOYWAR
7 WEFIWE, WEOFYWE
7 WFYREU
编辑:
我误解了原来的问题。这就是您正在寻找的:
select n.NOOfDays,
stuff( (select ',' + t2.DISTRInutorID
from t t2
where t2.NOOfDays = n.NOOfDays
for xml path ('')
), 1, 1, ''
) as list
from (select distinct NOOfDays from t) n;
请注意,SQL表表示无序集。这可以任意配对第一列相同的行,但不能保证这些行是相邻的,原因很简单,没有定义相邻
是一个dbfiddle。为什么要使用不受支持的SQL Server版本?现有的旧项目,不是基于NOOfDays合并所有Distributorid的升级DIT,但我想基于NOOfDays合并每两行或三行。@killisuman。这应该是你想要的。有一个输入错误,但它应该导致语法错误,而不是您描述的结果。
with cte as (
select t.*, row_number() over (order by (select null)) - 1 as seqnum
from t
)
select NOOfDays,
(case when count(*) = 1 then min(DISTRInutorID)
else max(case when seqnum % 2 = 0 then DISTRInutorID end) + ',' + max(case when seqnum % 2 = 1 then DISTRInutorID end)
end) as list
from cte
group by NOOfDays, floor(seqnum / 2);