2016-08-03 3 views
0

Ich muss an einem Mapping von einem ERP-System zu einer MySQL-Datenbank arbeiten. Die Struktur, die in das ERP-System ist:String Verkettung in Dynamic SQL mit PIVOT-Tabelle

_____________________________________ 
| 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 | ...   | ...  | 
------------------------------------- 

Was ich brauche Karte zu tun, ist es wie folgt aus:

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

ich das ERP-System zugreifen können über T-SQL und kann eine funktionierende dynamische Abfrage durchführen, die mir eine Tabelle zur Verfügung stellt und wie folgt aussieht:

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; 

Das Problem, das nun kommen wird, ist, dass das System für einige der Funktionen, die Mehrfachauswahl-Funktionen:

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

und die Abfrage gibt mir nur das erste Ergebnis in der Tabelle .

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

Also meine Frage ist, ob es eine Möglichkeit ist im Anschluss an eine String-Verkettung entweder in der Unterabfrage 'x' oder in der Pivot-Tabelle 'p', so wird das Ergebnis hinzuzufügen:

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

Antwort

0

@Serg hat die richtige Idee, aber die Felder scheinen aus zu sein. Das sollte näher sein.

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 gehört zunächst die gleichen FOR XML Trick. Art

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     
    ' 

Ersetzen Sie Ttt durch echte Datenquellen.