Transact SQL: конкатенация строк в упорядоченных строках с определенной логикой

-4

Учитывая таблицу

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

Таким образом, вы проходите все строки, упорядоченные по CN, GN, SG, SN. Когда следующая строка получила значение NULL в столбце C объедините значения CB если следующая строка не равна NULL в столбце C

спросил(а) 2021-01-19T16:45:10+03:00 2 месяца, 3 недели назад
1
Решение
63

Я бы использовал 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;

ответил(а) 2021-01-19T16:45:10+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема