按联系人分组-SQL Server

时间:2018-07-30 07:58:09

标签: sql sql-server

我正在尝试根据两个列的值合并或合并列。

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也是如此。

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

sqlfiddle

[结果]

|     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

sqlfiddle

答案 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;

如果您不知道最多只有两个匹配项,则需要进行更复杂的字符串聚合。