Sql 将多行合并为一行并根据行数追加列

Sql 将多行合并为一行并根据行数追加列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在尝试将同一表格的多行合并为一行 我有一张这样的样品台 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

我正在尝试将同一表格的多行合并为一行

我有一张这样的样品台

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  
我的预期产量应该是这样的

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  

提前感谢。

您可以将选项与dynamicSQL和运算符一起使用。在此场景中,列按结果排序,按列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)
演示

选项的列名称如下:“工厂、品牌、区域1、停工时间1、原因1、区域2、停工时间2、原因2等。”


演示

很明显,当有3条以上的记录同时存在时,任务无法完成,因此请澄清。哪些行应该分组的确切规则是什么?第一列是主键吗?还是前三个一起?您需要哪种编程语言的解决方案?可能只使用SQL,但不一定提供最便于维护的解决方案。您好,文档,前三列是主键。我会要求它在sql server 2005嗨,亚历山大,这是我一直在寻找的答案。非常感谢。再次感谢。只有一个问题可以重复列名吗?比如说,我有5个栏目“工厂、品牌、区域、停工期、原因”,现在这里工厂和品牌是主键。有没有可能得到这样的栏目名称“工厂、品牌、区域1、停工1、原因1、区域2、停工2、原因2等等。嗨,亚历山大,非常感谢。这是我一直在寻找的答案。太好了!!