使用 PIVOT table 在 Dynamic SQL 中进行字符串连接

String concatenation in Dynamic SQL using PIVOT table

我必须处理从 ERP 系统到 MySQL 数据库的映射。 ERP 系统中存在的结构是:

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

我可以通过 T-SQL 访问 ERP 系统,并且可以执行有效的动态查询,这为我提供了一个 table,看起来像:

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

查询只给了我 table.

中的第一个结果
 ________________________________________
| Article | size | color | functionality |
|---------|------|-------|---------------|
| Art3    | ...  | red   | ...           |
 ----------------------------------------

所以我的问题是,如果有任何方法可以在子查询 'x' 或数据透视表 table 'p' 中添加字符串连接,那么结果如下:

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

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 替换为真实数据源。

@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                
    '