2015-01-23 2 views
1

Вход:Мульти строк конкатенации с помощью КТР в SQL Server 2012

if object_id('tempdb..#Product') is not null drop table #Product 
if object_id('tempdb..#ProductFeatures') is not null drop table #ProductFeatures 
create table #Product(Product_id int, Product_label nvarchar(200)) 
create table #ProductFeatures(Product_id int, FeatureId int, Feature_label nvarchar(30), Feature_Value nvarchar(30)) 

insert into #Product(Product_id, Product_label) values 
(1, 'HL Mountain Frame - Silver, 42') 
,(2, 'Road-650 Black, 58') 

insert into #ProductFeatures(Product_id, FeatureId, Feature_label, Feature_Value) values 
(1, 1, 'Color', 'Silver') 
,(1, 2, 'Height', '42') 
,(1, 3, 'Widht', '12') 

,(2, 1, 'Color', 'Black') 
,(2, 2, 'Height', '58') 
,(2, 3, 'Widht', '58') 

Нужный выход: Concatenate каждой особенности строк группы и обновления этикетке продукта Состояние: добавить метку функции, если этот последний не существует этикетку продукта.

Например: «Серебряный» не будет добавлен, поскольку он существует на этикетке продукта.

Product_id Product_label 
----------- ------------------------------------ 
1   HL Mountain Frame - Silver, 42 12 
2   Road-650 Black, 58 

Вопрос: Как понять это КТР (а не с помощью курсора)?

+0

Sql Server Cursor Но я думаю, что там более простое решение – BENLTAIEF

ответ

1

Например, вы можете сделать это с FOR XML

UPDATE P 
SET P.Product_label = P2.newValue 
FROM #Product AS P 
INNER JOIN (
SELECT IP.Product_ID, IP.Product_label + 
ISNULL(

     (SELECT ' ' + PF.Feature_value AS [text()] 
     FROM #ProductFeatures AS PF 
     WHERE PF.Product_id = IP.Product_id 
     AND IP.Product_label NOT LIKE '%' + PF.Feature_value + '%' 
     FOR XML PATH('') 
    ), '') AS newValue 
FROM #Product AS IP 
) AS P2 
ON P.Product_ID = P2.Product_ID 
+0

Да, это правда, но OP хочет обновить Product_Label;) –

+0

ok ok let it be .... thanks @Macie jLos – Darka

+0

Вы очень желанны, @ Дарка;) Упрощенный! –

1

решение Дарка является очень хорошим. Я хотел бы, чтобы обеспечить альтернативный способ, с помощью шарнира:

----uncomment below query to see how it works ;) 
--SELECT Product_id, Product_label, REPLACE(Product_label, CONCAT([Color],', ', [Height]), CONCAT([Color],', ' ,[Height],' ', [Widht])) AS NewLabel 
--FROM (
-- SELECT Product_id, Product_label, [Color], [Height], [Widht] 
-- FROM (
--  SELECT PF.Product_id, P.Product_label , PF.Feature_label , PF.Feature_Value 
--  FROM #ProductFeatures AS PF INNER JOIN #Product P ON PF.Product_id = P.Product_id 
-- ) AS dt 
-- PIVOT (MAX(Feature_Value) FOR Feature_label IN ([Color], [Height], [Widht])) AS pvt 
--) AS T 


UPDATE t1 SET Product_label = REPLACE(t2.Product_label, CONCAT(t2.[Color],', ', t2.[Height]), CONCAT(t2.[Color],', ' ,t2.[Height],' ', t2.[Widht])) 
FROM #Product AS t1 INNER JOIN 
(
    SELECT Product_id, Product_label, [Color], [Height], [Widht] 
    FROM (
     SELECT PF.Product_id, P.Product_label , PF.Feature_label , PF.Feature_Value 
     FROM #ProductFeatures AS PF INNER JOIN #Product P ON PF.Product_id = P.Product_id 
    ) AS dt 
    PIVOT (MAX(Feature_Value) FOR Feature_label IN ([Color], [Height], [Widht])) AS pvt 
) AS t2 ON t1.Product_id = t2.Product_id 

SELECT * 
FROM #Product 

Примечания: выше решение не оптимизировано ... Но я отметил, что это альтернативный способ.

Приветствие,
Maciej

+0

Использование pivot будет отличным, Но набор функций не одинаковый для каждого продукта, и мы не можем их перечислить для динамического запроса. – BENLTAIEF

0

Для @Darka, спасибо за вашу помощь

Просто немного корректировки в сценарии, потому что мы ищем дырочное слово :)

charindex(' ' + PF.Feature_value, IP.Product_label) = 0 

SELECT IP.Product_ID, IP.Product_label + 
ISNULL(

     (SELECT ' ' + PF.Feature_value AS [text()] 
     FROM #ProductFeatures AS PF 
     WHERE PF.Product_id = IP.Product_id 
     AND charindex(' ' + PF.Feature_value, IP.Product_label) = 0 
     FOR XML PATH('') 
    ), '') AS newValue 
FROM #Product AS IP 
Смежные вопросы