连接具有相同值的行的列值(不同列的)

Posted

技术标签:

【中文标题】连接具有相同值的行的列值(不同列的)【英文标题】:Concatenate column values for rows with the same values (of different columns) 【发布时间】:2011-09-18 19:25:06 【问题描述】:

SQL Server 2005

我有一个返回的表

ID  name    prop    value
--------------------------
1   one     Prop1   a
1   one     Prop1   b
1   one     Prop2   c
2   two     Prop1   d
2   two     Prop2   e

如何在其上运行选择以返回

ID  name    prop        value
-----------------------------
1   one     Prop1       a,b
1   one     Prop2       c
2   two     Prop1       d
2   two     Prop2       e

【问题讨论】:

您是如何在所需输出的最后一行获得 ID 的 4 个? 看看***.com/questions/451415/…. 【参考方案1】:

试试这个:

--Concatenation with FOR XML and eleminating control/encoded character expansion "& < >"
set nocount on;
declare @YourTable table (RowID int, RowName varchar(5), prop varchar(5), RowValue varchar(5))

insert into @YourTable VALUES (1,'one','Prop1','a')
insert into @YourTable VALUES (1,'one','Prop1','b')
insert into @YourTable VALUES (1,'one','Prop2','c')
insert into @YourTable VALUES (2,'two','Prop1','d')
insert into @YourTable VALUES (2,'two','Prop2','e')
set nocount off

SELECT
    t1.RowID,t1.RowName,t1.Prop
        ,STUFF(
                   (SELECT
                        ', ' + t2.RowValue
                        FROM @YourTable t2
                        WHERE t1.RowID=t2.RowID AND t1.RowName=t2.RowName AND t1.Prop=t2.Prop
                        ORDER BY t2.RowValue
                        FOR XML PATH(''), TYPE
                   ).value('.','varchar(max)')
                   ,1,2, ''
              ) AS ChildValues
    FROM @YourTable t1
    GROUP BY t1.RowID,t1.RowName,t1.Prop

输出:

RowID       RowName Prop  ChildValues
----------- ------- ----- ------------
1           one     Prop1 a, b
1           one     Prop2 c
2           two     Prop1 d
2           two     Prop2 e

(4 row(s) affected)

【讨论】:

如果值包含任何“特殊”字符,如&amp;&lt;&gt; 等,则使用 xml 连接行可能会出现问题。我的答案中的代码将正确处理所有特殊字符.例如,如果上表中的最后一列的值是a&amp;amp;,则此代码将正确显示a&amp;amp;,而我见过的大多数其他XML 连接代码将错误地显示a&amp;amp;【参考方案2】:
SELECT ID
    ,name
    ,prop
    ,STUFF((SELECT ',' + value FROM table t2 WHERE t2.ID = t1.ID and t2.name = t1.name AND t2.prop = t1.prop FOR XML PATH('')),1,1,'') AS value
FROM table t1
GROUP BY ID,name,prop

请参考: SQL Query to get aggregated result in comma seperators along with group by column in SQL Server

【讨论】:

【参考方案3】:
SELECT T1.Name, T1.prop, T1.value+","+T2.value
From Table T1 INNER JOIN Table T2
ON T1.name = T2.name and T1.prop = T2.Prop and T1.value<>T2.value

但这仅适用于两个值。告诉我,我可以重写 N 个值。

【讨论】:

我没有DV,但我不认为这是他所追求的。我认为他不想手动确定有多少值并为那么多出现编写代码。 是的,我希望有 N 个值。

以上是关于连接具有相同值的行的列值(不同列的)的主要内容,如果未能解决你的问题,请参考以下文章

SQL如何查询出某一列中不同值出现的次数?

根据另一列的字段值选择具有相同列值的行

计算 Pandas 中具有相同列值的行的平均值

聚合具有两个或多个具有相同值的列的行

查询以返回在所有行中对于一列的每个不同值具有相同值的行值

VBA比较两个列表并删除不同列中具有重复值的行