-1

同じテーブルの複数の行を 1 つに結合しようとしています。

私はこのようなサンプルテーブルを持っています

Col1    Col2    Col3    Col4    Col5    Col6
1   BH1 CB  12  CC  CC - Conveyor Mal.
1   BH1 CB  104 ZC  ZC - Full/Emp Signal Mal.
1   BH1 CB  109 HD  HD - Dosing Pipe Blocked
2   BH2 CD  14  HP  HP- Laptop
2   BH2 CD  21  DE  DE -Dell
3   BH1 BC  41  FE  FE- Fuji
4   BH9 BC  95  SN  SN-Sony

私の予想アウトプットはこのようなものになるはずです

Col1    Col2    Col3    Col4    Col5    Col6    Col7    Col8    Col9    Col10   Col11   Col12
1   BH1 CB  12  CC  CC - Conveyor Mal.  104 ZC  ZC - Full/Emp Signal Mal.   109 HD  HD - Dosing Pipe Blocked
2   BH2 CD  14  HP  HP- Laptop  21  DE  DE -Dell             
3   BH1 BC  41  FE  FE- Fuji                         
4   BH9 BC  95  SN  SN-Sony  

前もって感謝します。

4

1 に答える 1

0

オプションは、dynamicSQL、APPLY()、およびPIVOT演算子で使用できます。このシナリオでは、Col4 列で並べ替えられた結果の列の順序です。

DECLARE @cols nvarchar(max),
        @query nvarchar(max)
SELECT @cols = 
  STUFF((SELECT x.ColName
         FROM (
               SELECT ',' + QUOTENAME('Col' + CAST(3 + ROW_NUMBER() OVER(PARTITION BY Col1, Col2, Col3 ORDER BY Col4) AS nvarchar(10))) AS ColName,
                      ROW_NUMBER() OVER(PARTITION BY Col1, Col2, Col3 ORDER BY Col4) AS rn
               FROM dbo.test31 CROSS APPLY (VALUES('Col'), ('Col'), ('Col')) o(Col)) x
         GROUP BY x.ColName, x.rn
         ORDER BY x.rn                   
         FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '')
SET @query = 
  'SELECT * FROM 
    (      
     SELECT t.Col1, t.Col2, t.Col3,            
            ''Col'' + CAST(3 + ROW_NUMBER() OVER(PARTITION BY t.Col1, t.Col2, t.Col3 ORDER BY t.Col4) AS nvarchar(10)) AS ColName,            
            COALESCE(CAST(o.oCol4 AS nvarchar(10)), o.oCol5, o.oCol6) AS ListValues            
     FROM dbo.test31 t CROSS APPLY (
                                    SELECT oCol4, oCol5, oCol6
                                    FROM (VALUES (t.Col4, NULL, NULL),
                                                 (NULL, t.Col5, NULL),
                                                 (NULL, NULL, t.Col6))
                                    x(oCol4, oCol5, oCol6)
                                    ) o
     ) x
     PIVOT
      (
       MAX(ListValues) FOR ColName IN(' + @cols + ')
       ) p'
EXEC (@query)

SQLFiddle のデモ

「プラント、ブランド、エリア 1、ダウンタイム 1、理由 1、エリア 2、ダウン時間 2、理由 2 など」のような列名のオプション。

DECLARE @cols nvarchar(max),
        @query nvarchar(max)
SELECT @cols = 
  STUFF((SELECT ',' + QUOTENAME(o.Col) AS ColName                
         FROM
          (
           SELECT *, CAST(ROW_NUMBER() OVER(PARTITION BY Plant, Brand ORDER BY Area) AS nvarchar(10)) AS rn
           FROM dbo.test35) t CROSS APPLY (VALUES('Area' + t.rn), ('DownTime' + t.rn), ('Reasons' + t.rn)
           ) o(Col)
         GROUP BY o.Col, t.rn
         ORDER BY t.rn                   
         FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '')       

SET @query = 
  'SELECT * FROM 
    (      
     SELECT t.Plant, t.Brand, o.ColName,            
            COALESCE(CAST(o.Area AS nvarchar(10)), o.DownTime, o.Reasons) AS ListValues
     FROM
      (
       SELECT Plant, Brand, Area, DownTime, Reasons,
              CAST(ROW_NUMBER() OVER(PARTITION BY Plant, Brand ORDER BY Area) AS nvarchar(10)) AS rn            
       FROM dbo.test35) t CROSS APPLY (
                                      SELECT Area, DownTime, Reasons, ColName
                                      FROM (VALUES (t.Area, NULL, NULL, ''Area'' + t.rn),
                                                   (NULL, t.DownTime, NULL, ''DownTime'' + t.rn),
                                                   (NULL, NULL, t.Reasons, ''Reasons'' + t.rn))
                                      x(Area, DownTime, Reasons, ColName)
                                      ) o
      ) x
     PIVOT
      (
       MAX(ListValues) FOR ColName IN(' + @cols + ')
       ) p'
EXEC (@query) 

SQLFiddle のデモ

于 2013-03-12T15:24:32.127 に答える