我这样做:
, 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正在减慢我的速度。
答案 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子句,该子句应该过滤您的连接值,只使用外部查询中当前行的行。