2016-08-03 81 views
0

我必須處理從ERP系統到MySQL數據庫的映射。這是目前在ERP系統中的結構是:使用PIVOT表的動態SQL中的字符串連接

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

什麼,我需要做的是地圖像這樣:

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

我可以通過訪問ERP系統T-SQL並且可以執行工作的動態查詢,該查詢爲我提供了一個表格,如下所示:

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; 

,現在快到了的問題,該系統具有多項選擇的一些特點:

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

和查詢只是給我的第一個結果在表。

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

所以我的問題是,如果有任何的方式來添加一個字符串連接無論是在子查詢「X」或數據透視表中「P」,所以結果就變成如下:

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

回答

0

@Serg有正確的想法,但領域似乎已關閉。這應該更接近。

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功能首先用同樣的伎倆FOR XML

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     
    ' 

將ttt替換爲真實的數據源。