连接并分组多行

时间:2012-02-22 22:01:39

标签: sql sql-server sql-server-2008

我这样做:

, cte_proc_code (accn,proc_code) as
(SELECT accn_id, 
    (SELECT proc_code + ','
     FROM [XDataFullExtract].[dbo].[accn_billed_procedures] 
     FOR XML PATH('')
    ) 
FROM [XDataFullExtract].[dbo].[accn_billed_procedures] 
group by accn_id)

我的数据如下:

accn_id,proc_code
AA123, 1132
AA123, 5234
AA123, 4524
BB123, 2345
BB123, 4444

我想要的结果是:

accn_id,proc_code
AA123, 1132, 5234, 4524
BB123, 2345, 4444

我的解决方案有效,但它太慢了!

有更快的方法吗?我认为XML正在减慢我的速度。

2 个答案:

答案 0 :(得分:1)

这种方法涉及向您的表添加一个临时列,但可以更快地运行:

-- table, with new varchar(max) column cncat added
declare @t table(accn_id varchar(30), proc_code varchar(30), cncat varchar(max));
declare @concat varchar(max)=''; --staging variable
 
insert into @t values
('AA123','1132','')
, ('AA123','5234','')
, ('AA123','4524','')
, ('BB123','2345','')
, ('BB123','4444','');
 
-- update cncat
with cte as (select *,r=row_number()over(partition by accn_id order by proc_code) from @t)
update cte set @concat = cncat = case cte.r when 1 then '' else @concat end + ','+proc_code
 
-- results
select accn_id, cncat=stuff(max(cncat),1,1,'')
from @t
group by accn_id;
 
-- clean up (optional)
update @t set cncat='';
go

答案 1 :(得分:1)

在您提供的查询中,不是“XML会让您失望” 对于返回的每一行,您使用表格中的所有值构建逗号分隔字符串 您缺少子查询中的where子句,该子句应该过滤您的连接值,只使用外部查询中当前行的行。