2016-08-03 31 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 | ...   | 
---------------------------------------- 

だから、「P」サブクエリ「X」またはピボットテーブル内のいずれかの文字列の連結を追加する方法があるかどうか私の質問は、ですので、結果は以下のようになります。

_____________________________________________ 
| 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を実際のデータソースに置き換えます。