Объединить и сгруппировать несколько строк - PullRequest
0 голосов
/ 23 февраля 2012

Я делаю это:

, 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 ]

1 голос
/ 23 февраля 2012

В указанном вами запросе это не "XML, который замедляет вас".
Вы строите строку через запятую, используя все значения в вашей таблице для каждой возвращаемой строки.
В вашем подзапросе отсутствует предложение where, которое должно фильтровать ваши объединенные значения, чтобы использовать только строки для текущей строки во внешнем запросе.

1 голос
/ 23 февраля 2012

Этот подход подразумевает добавление промежуточного столбца к вашей таблице, но может выполняться быстрее:

-- 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...