2016-08-03 1 views
0

Je dois travailler sur un mappage d'un système ERP vers une base de données MySQL. La structure qui est présente dans le système ERP est:Chaîne de concaténation en SQL dynamique à l'aide de la table PIVOT

_____________________________________ 
| Article | Feature  | Criterion | 
|---------|---------------|-----------| 
| Art1 | size   | 4*10  | 
| Art1 | color   | red  | 
| Art1 | functionality | doesA  | 
| Art1 | ...   | ...  | 
| Art2 | size   | 2*5  | 
| Art2 | color   | green  | 
| Art2 | functionality | doesB  | 
| Art2 | ...   | ...  | 
------------------------------------- 

Ce que je dois faire est la carte comme ceci:

________________________________________________ 
| Article | size | color | functionality | ... | 
|---------|------|-------|---------------|-------| 
| Art1 | 4*10 | red | doesA   | ... | 
| Art2 | 2*5 | green | doesB   | ... | 
------------------------------------------------ 

je peux accéder au système ERP via T-SQL et peut effectuer une requête dynamique de travail, qui me fournit une table et ressemble à:

DECLARE @cols AS nvarchar(MAX), 
@query AS nvarchar(MAX) 


SELECT @cols = stuff((SELECT DISTINCT ', ' + quotename(f.Feature) + '' 
FROM CRITERION c, FEATURE f 
WHERE --necessary joins 

FOR xml PATH(''), TYPE 
    ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 


SET @query = N'SELECT Article, ' + @cols + N' 
    FROM (
    SELECT Article, Feature, Criterion 
    FROM --necessary tables 
    WHERE --necessary joins 
    ) x 

    pivot 
    (
     max(Criterion) 
     FOR Feature IN (' + @cols + N') 
    ) p     
    ' 

EXEC sp_executesql @query; 

Le problème qui vient maintenant est que le système dispose d'une sélection multiple pour quelques-unes des caractéristiques:

_____________________________________ 
| Article | Feature  | Criterion | 
|---------|---------------|-----------| 
| Art3 | color   | red  | 
| Art3 | color   | green  | 
------------------------------------- 

et la requête me donne juste le premier résultat dans le tableau .

________________________________________ 
| Article | size | color | functionality | 
|---------|------|-------|---------------| 
| Art3 | ... | red | ...   | 
---------------------------------------- 

Donc ma question est, s'il y a un moyen d'ajouter une concaténation de chaîne, soit dans la sous-requête « x » ou dans le tableau croisé dynamique « p », de sorte que le résultat devient suivant:

_____________________________________________ 
| Article | size | color  | functionality | 
|---------|------|------------|---------------| 
| Art3 | ... | red, green | ...   | 
--------------------------------------------- 

Répondre

0

@Serg a la bonne idée mais les champs semblent être éteints. Cela devrait être plus proche.

SET @query = N' 
    SELECT Article, ' + @cols + N' 
    FROM (
      SELECT Article, 
        Feature, 
        Criterion = STUFF(
             (SELECT '', '' + t2.Criterion 
             FROM t1 as t2 
             WHERE t2.Article = t1.Article 
               AND t2.[Feature] = t1.[Feature] 
             FOR XML PATH('''')), 1, 2,'''') 
      FROM (SELECT Article, Feature, Criterion 
        FROM  --necessary tables 
        WHERE  --necessary joins) t1 
     ) x 
    pivot 
    (
     MAX(Criterion) 
     FOR Feature IN (' + @cols + N') 
    ) p     
    ' 
0

GROUP BY propose d'abord en utilisant la même astuce FOR XML. Type de

SET @query = N'SELECT Article, ' + @cols + N' 
    FROM (
     SELECT Article, Criterion, 
     Feature = stuff(
     (SELECT '',''+ t2.Feature 
     FROM ttt as t2 
     WHERE t2.Article = t1.Article AND 
      t2.Criterion = t1.Criterion 
     FOR XML PATH('')) 
     ,1,1,'''') 
    FROM ttt t1 
    GROUP BY Article, Criterion  
    ) x 

    pivot 
    (
     max(Criterion) 
     FOR Feature IN (' + @cols + N') 
    ) p     
    ' 

Remplacez ttt par des sources de données réelles.