我正在尝试根据两个列的值合并或合并列。
ID ID_1 Name Value ID_3
NULL 1 A x NULL
NULL 1 B x NULL
NULL 1 A y NULL
NULL 2 C p NULL
3 NULL A x NULL
3 NULL B x NULL
3 NULL A y NULL
4 NULL C p NULL
预期结果:
ID ID_1 Name Value ID_3
NULL 1 AB x NULL
NULL 1 A y NULL
NULL 2 C p NULL
3 NULL AB x NULL
3 NULL A y NULL
4 NULL C p NULL
对于Id_1,我想连接Name,但仅在value列具有相同值的地方。 对于ID_2也是如此。
答案 0 :(得分:3)
如果它是SQL Server 2017
,则可以尝试使用string_agg
函数。
select ID,ID_1,string_agg(Name, '') 'Name',Value,ID_3
from T
group by ID,ID_1,Value,ID_3
[结果] :
| ID | ID_1 | Name | Value | ID_3 |
|--------|--------|------|-------|--------|
| (null) | 1 | AB | x | (null) |
| (null) | 1 | A | y | (null) |
| (null) | 2 | C | p | (null) |
| 3 | (null) | AB | x | (null) |
| 3 | (null) | A | y | (null) |
| 4 | (null) | C | p | (null) |
如果您的SQL Server
版本低于2017,则可以尝试将与FOR XML和PATH一起使用。
SELECT
ID,
ID_1,
STUFF((
SELECT Name
FROM T
WHERE
Value = t1.Value
and
(ID = t1.ID or ID_1 = t1.ID_1)
FOR XML PATH(''),TYPE).value('.','VARCHAR(MAX)')
,1,0,'') AS 'Name',
Value,
ID_3
FROM T t1
group by ID,ID_1,Value,ID_3
答案 1 :(得分:0)
如果最多需要聚合两行,那么一个更简单的方法是:
select id, id_1,
(case when min(name) = max(name) then min(name)
else min(name) + max(name)
end) as names
value, id_3
from t
group by id, id_1, value, id_3;
如果您不知道最多只有两个匹配项,则需要进行更复杂的字符串聚合。