【问题标题】:Transact SQL: String concatenation within ordered rows with certain logicTransact SQL:具有特定逻辑的有序行内的字符串连接
【发布时间】:2019-01-24 13:16:50
【问题描述】:

给定表格

CREATE TABLE dbo.T
(
    CN char(2) NOT NULL,
    GN int NOT NULL,
    SG int NOT NULL,
    SN int NOT NULL,
    C varchar(3),
    CB varchar(max)
);
INSERT INTO dbo.T(CN,GN,SG,SN,C,CB)
VALUES
('P1',9,6,0,'020','AAA'),
('P1',9,6,1,NULL,'BBB'),
('P1',9,6,2,'020','CCC'),
('P1',9,6,3,NULL,'DDD'),
('P1',9,6,4,'020','EEE'),
('P1',9,6,5,NULL,'FFF'),
('P1',9,6,6,'020','GGG'),
('P1',9,6,7,NULL,'HHH'),
('P1',9,6,8,'020','JJJ'),
('P1',9,6,9,NULL,'LLL'),
('P1',9,6,10,NULL,'MMM'),
('P1',9,6,11,NULL,'NNN')

想要的输出是这样的:

CN  GN  SG  SN  C    CB
P1  9   6   0   020  AAABBB
P1  9   6   2   020  CCCDDD
P1  9   6   4   020  EEEFFF
P1  9   6   6   020  GGGHHH
P1  9   6   8   020  JJJLLLMMMNNN

因此,您将遍历由CNGNSGSN 排序的所有行。从C 中第一次出现非空值开始。当下一行在列 C 中获得 NULL 值时,只要下一行在列 C 中不为 NULL,则连接 CB 值。

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 我的想法与 row_number() 有关,但我失败了...
  • 定义“关注”。表没有固有的顺序。我们应该使用哪一列来确定顺序?
  • 对不起,我说是分组的,其实是有序的
  • 我编辑了描述

标签: sql-server tsql sql-server-2017


【解决方案1】:

我会将CTE累积聚合一起使用:

with t as (
     select t.*, 
            sum(case when c is not null then 1 else 0 end) over (partition by cn, gn, sg order by sn) as grp
     from dbo.T as t  
)
select distinct t.CN, t.GN, t.SG, t.SN, t.C, tt.cb
from t cross apply
     ( select ''+t1.cb
       from t t1 
       where t1.cn = t.cn and t1.gn = t.gn and t1.sg = t.sg and t1.grp = t.grp
       for xml path('')
     ) tt(cb)
where t.C is not null;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    相关资源
    最近更新 更多