【问题标题】:How to combine each three rows into single column in SQL Server 2008?如何在 SQL Server 2008 中将每三行合并为一列?
【发布时间】:2020-08-10 16:25:20
【问题描述】:
NOOfDays   DISTRInutorID
-------------------------    
1           abcd    
1           cdef    
2           DFSDF    
2           SFSDD    
2           SDFSD    
2           WAOYWAR    
7           WEFIWE    
7           WEOFYWE    
7           WFYREU

以上是我的示例表之一,我想根据 NOOfDays 组合每两行。

预期输出:

NOOfDays         DiSTRInutorID
------------------------------
1                 abcd, cdef              
2                 DFSDF, SFSDD       
2                 SDFSD, WAOYWAR            
7                 WEFIWE, WEOFYWE         
7                 WFYREU

【问题讨论】:

  • 您为什么使用不受支持的 SQL Server 版本?
  • 现有老项目,未升级

标签: sql sql-server sql-server-2008


【解决方案1】:

在旧版本的 SQL Server 中,逻辑如下:

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;

编辑:

我误解了原来的问题。这就是你要找的:

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

请注意,SQL 表代表 无序 集。这会任意配对第一列相同的行,但不能保证它们是相邻的——原因很简单,“相邻”没有定义。

Here 是一个 dbfiddle。

【讨论】:

  • 它结合了所有基于 NOOfDays 的 DISTRInutorID,但我想根据 NOOfDays 组合每两三行。
  • @killisuman 。 . .这应该做你想要的。有一个错字,但它应该导致语法错误,而不是你描述的结果。
猜你喜欢
  • 2011-09-30
  • 1970-01-01
  • 2012-05-27
  • 2013-08-08
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多