SQL 将多行合并在一起 Table
SQL Merge Multiple Rows together Table
我有一个 table 具有以下布局
Row ID Name Notes
1 100 A Full Text
2 200 B Full Text
3 300 C Text part1
4 Text part2
5 Text part3
6 400 D Full Text
某行注释单元格的内容偶尔会填充到其下方的行中(例如,第 3 行在第 4 行和第 5 行中有注释内容。)换句话说,第 3 行是最后一个 'valid'行。我需要将第 4 行和第 5 行的注释内容连接到第 3 行。如何将注释内容合并到一行(第 3 行)并删除不再需要的行(第 4 行和第 5 行)?所以最后的成品会是这样
Row ID Name Notes
1 100 A Full Text
2 200 B Full Text
3 300 C Full Text
6 400 D Full Text
您可以使用累积 count()
分配组然后聚合:
select row_number() over (order by min(row)) as row,
min(id) as id, min(name) as name,
string_agg(text, ' ') within group (order by row) as text
from (select t.*,
count(id) over (order by row) as grp
from t
) t
group by grp;
编辑:
在旧版本的SQL服务器中,您可以使用:
select min_row, id,
stuff( (select ' ' + t.notes
from t t2
where t2.row >= i.min_row and
(t2.row < i.max_row or i.max_row is null)
for xml path ('')
), 1, 1, ''
) as notes
from (select id, name, min(row) as min_row, lead(min(row)) over (order by id) as max_row
from t
group by by id, name
) i;
如果您使用的是 Sql 服务器 2016,那么您可以试试这个查询:
--you are getting NumberGroup (using window function )
with cte as
(
select *, sum(ID)over(order by Row rows unbounded preceding)NumGr from Table
)
-- using FOR XML PATH to get one row within group (Full text in your case)
select min(Row)Row,
max(ID)ID,max(Name)Name,max(Notes_new)Notes
from
(
select *, stuff((select ' '+ Notes from cte cte1 where cte1.NumGr=cte2.NumGr
FOR XML PATH('')),1,1,'')Notes_new
from cte cte2
)X
group by NumGr
我有一个 table 具有以下布局
Row ID Name Notes
1 100 A Full Text
2 200 B Full Text
3 300 C Text part1
4 Text part2
5 Text part3
6 400 D Full Text
某行注释单元格的内容偶尔会填充到其下方的行中(例如,第 3 行在第 4 行和第 5 行中有注释内容。)换句话说,第 3 行是最后一个 'valid'行。我需要将第 4 行和第 5 行的注释内容连接到第 3 行。如何将注释内容合并到一行(第 3 行)并删除不再需要的行(第 4 行和第 5 行)?所以最后的成品会是这样
Row ID Name Notes
1 100 A Full Text
2 200 B Full Text
3 300 C Full Text
6 400 D Full Text
您可以使用累积 count()
分配组然后聚合:
select row_number() over (order by min(row)) as row,
min(id) as id, min(name) as name,
string_agg(text, ' ') within group (order by row) as text
from (select t.*,
count(id) over (order by row) as grp
from t
) t
group by grp;
编辑:
在旧版本的SQL服务器中,您可以使用:
select min_row, id,
stuff( (select ' ' + t.notes
from t t2
where t2.row >= i.min_row and
(t2.row < i.max_row or i.max_row is null)
for xml path ('')
), 1, 1, ''
) as notes
from (select id, name, min(row) as min_row, lead(min(row)) over (order by id) as max_row
from t
group by by id, name
) i;
如果您使用的是 Sql 服务器 2016,那么您可以试试这个查询:
--you are getting NumberGroup (using window function )
with cte as
(
select *, sum(ID)over(order by Row rows unbounded preceding)NumGr from Table
)
-- using FOR XML PATH to get one row within group (Full text in your case)
select min(Row)Row,
max(ID)ID,max(Name)Name,max(Notes_new)Notes
from
(
select *, stuff((select ' '+ Notes from cte cte1 where cte1.NumGr=cte2.NumGr
FOR XML PATH('')),1,1,'')Notes_new
from cte cte2
)X
group by NumGr