2016-08-03 82 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替换为真实的数据源。