SQL - 将多行合并为一行

3
首先,我已经查看了this,但我的问题略有不同。我已经尝试过这种方法并试图修改它以适应我的需求,但没有成功。
问题:
从几个查询的结果中,我得到以下结果:
ID   |  NAME  |   DESCID  |   TALL   |   GOODLOOKING   |   FAT
_______________________________________________________________
1    |  John  |      1    |  '1.8m'  |       Null      |   Null
1    |  John  |      2    |   Null   |      'Yes'      |   Null
1    |  John  |      3    |   Null   |       Null      |  '84kg'
1    |  John  |      4    |   Null   |       Null      |  '85kg'

注意:这只是一些虚拟数据。

我需要输出如下:

ID   |  NAME  |   TALL   |   GOODLOOKING   |       FAT
__________________________________________________________
1    |  John  |  '1.8m'  |       'Yes'     |   '84kg|85kg'

如果不可能的话,请告诉我,这样你就可以自由地告诉我了。
任何SQL大师能提供帮助吗?

1
所以只在“fat”列中进行连接?如果“Goodlooking”有2个“not null”“distinct”值,会怎么样? - ughai
在 descid 之后的任何列中进行连接。感谢询问。 - Terrance00
Group_concat,是SQL Server还是仅限于MySQL? - jarlh
Sql Server。就像标签。 - Terrance00
你也可以看一下递归CTE。 - Sébastien Sevrin
1个回答

3

在SQL Server中没有像Group_Concat这样可以直接使用的函数。您可以在相关查询中使用FOR XML

SELECT ID,NAME,
STUFF((SELECT '|'+TALL        FROM Tbl1 t2 WHERE t2.ID = t1.ID AND t2.NAME = t1.NAME ORDER BY t2.descid FOR XML PATH(''),TYPE).value('.','VARCHAR(MAX)'),1,1,'') as tall,
STUFF((SELECT '|'+GOODLOOKING FROM Tbl1 t2 WHERE t2.ID = t1.ID AND t2.NAME = t1.NAME ORDER BY t2.descid FOR XML PATH(''),TYPE).value('.','VARCHAR(MAX)'),1,1,'') as GOODLOOKING,
STUFF((SELECT '|'+FAT         FROM Tbl1 t2 WHERE t2.ID = t1.ID AND t2.NAME = t1.NAME ORDER BY t2.descid FOR XML PATH(''),TYPE).value('.','VARCHAR(MAX)'),1,1,'') as FAT
FROM Tbl1 t1
GROUP BY ID,NAME

SQL Fiddle


看起来不错。我已经点赞了,测试后会标记为答案。谢谢。 - Terrance00
好的,这个可以运行。然而,解决方案太慢了。这是这种工作的特性吗?因为它比C#中的暴力循环要慢得多。 - Terrance00
是的,这会很慢,因为 SQL 需要读取表格 4 次。 - ughai
@Terrance00:既然你说非聚合行集是几个查询的结果,那么你可以尝试看看这里建议的技术是否可以与任何一个查询结合使用——谁知道,当应用于原始数据集时,它可能会表现得更好。 - Andriy M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接