Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQLServer2008中,如何将每三行合并为一列?_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

在SQLServer2008中,如何将每三行合并为一列?

在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合并每两行

预期产出:

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);