#sql-server #tsql #cursor
#sql-сервер #tsql #курсор
Вопрос:
Пример таблицы:
ИДЕНТИФИКАТОР продукта
1 Опрос,
1 Политика
, 1 Счет-фактура,
2 Накладных,
2 Опроса,
3 Политики
, 3 счета-фактуры
В итоге я хотел бы получить таблицу с 3 строками (по одной для каждого из идентификаторов) с продуктами в списке, разделенном запятыми:
ИДЕНТИФИКАТОР продукта
1 Опрос, политика, счет
2 Счет, опрос
3 Политика, счет
Я смог сделать это с помощью определяемой пользователем скалярной функции, но это очень медленно, я считаю, что более правильным решением был бы курсор, но именно здесь мне нужна помощь
Комментарии:
1. Можете ли вы показать нам пользовательскую функцию? Я был бы более склонен попытаться улучшить его производительность, а не использовать решение на основе курсора.
Ответ №1:
Не уверен в скорости по сравнению с UDF или cursor, но вы можете попробовать:
with T(ID, Product) as
(
select 1, 'Survey' union all
select 1, 'Policy' union all
select 1, 'Invoice' union all
select 2, 'Invoice' union all
select 2, 'Survey' union all
select 3, 'Policy' union all
select 3, 'Invoice'
)
select
T1.ID,
stuff((select ', ' T2.Product
from T as T2
where T1.ID = T2.ID
for xml path(''), type).value('.', 'nvarchar(max)'), 1, 2, '') as Product
from T as T1
group by T1.ID
Ответ №2:
Доступный для выполнения пример: https://data.stackexchange.com/stackoverflow/q/101245 /
DECLARE @tbl AS TABLE (ID int, Product VARCHAR(50))
INSERT INTO @tbl VALUES (
1 ,'Survey'),
( 1 ,'Policy'),
( 1 ,'Invoice'),
( 2 ,'Invoice'),
( 2 ,'Survey'),
( 3 ,'Policy'),
( 3 ,'Invoice')
;WITH IDs AS (
SELECT ID
FROM @tbl
GROUP BY ID
)
SELECT IDs.ID, STUFF(Products.Products, 1, 1, '')
FROM IDs
OUTER APPLY (
SELECT ',' Product
FROM @tbl AS tbl
WHERE ID = IDs.ID
FOR XML PATH ('')
) AS Products (Products)