SQL Server:如何组合行
Posted
技术标签:
【中文标题】SQL Server:如何组合行【英文标题】:SQL Server: How to combine rows 【发布时间】:2015-12-01 16:58:26 【问题描述】:我有一个类似的查询
select top 10 Col1,Col2,Col3 from tab1
这给了我
(1, 1, 1)
(5, 2, 59)
(8, 3, 69)
(9, 4, 70)
(10, 5, 71)
(11, 6, 72)
(11, 7, 73)
(11, 8, 74)
(11, 9, 75)
(11, 10, 76)
我想把结果压缩成
(1, 1, 1)
(5, 2, 59)
(8, 3, 69)
(9, 4, 70)
(10, 5, 71)
(11, 6, 72,73,74,75,76)
如何在选择查询本身中做到这一点?
编辑
请注意,所有列都是 int 类型。在查询结果中,我不介意第三列是否转换为 varchar
编辑
最终,我将查询结果存储在数据框中。使用数据框更容易实现这一点吗?
【问题讨论】:
我认为这在单个选择查询中是不可能的,因为选择查询对于所有行都有一组明确的返回列。 那么我需要创建一个临时表吗?在 python 的数据框中这样做会更容易吗? @RenéVogt 这可以使用 XML PATH 技术在单个查询中完成。 你想要(11, 6, '72,73,74,75,76')
将它们组合成一个字符串吗??
不知道为什么要投反对票,但这种事情已经在这里发生了数百次。 :)
【参考方案1】:
您可以使用以下技术做到这一点。请注意,我以可消耗的格式发布了 ddl 和示例数据。以后你应该自己做。
if OBJECT_ID('tempdb..#something') is not null
drop table #something
create table #something
(
Col1 int
, Col2 int
, Col3 int
)
insert #something
select *
from (Values
(1, 1, 1),
(5, 2, 59),
(8, 3, 69),
(9, 4, 70),
(10, 5, 71),
(11, 6, 72),
(11, 7, 73),
(11, 8, 74),
(11, 9, 75),
(11, 10, 76))x(Col1, col2,col3)
select Col1
, MIN(Col2) as Col2
, Stuff((select ',' + cast(Col3 as varchar(4))
from #something s2
where s2.Col1 = s.Col1
for xml path('')), 1,1 , '') as Col3
from #something s
group by Col1
【讨论】:
varchar 需要足够长以保存您的 int 值。我不知道您的实际数据中有什么值。从您的样本中,它至少需要为 2,但我选择了 4,它将处理高达 9999 的值。随意调整该大小以适应您的实际数据要求。以上是关于SQL Server:如何组合行的主要内容,如果未能解决你的问题,请参考以下文章