Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Kết hợp nhiều hàng thành một hàng và nối các cột tùy thuộc vào số lượng hàng

Bạn có thể sử dụng tùy chọn với dynamicSQL, ÁP DỤNG ( ) PIVOT các toán tử. Trong trường hợp này, các cột theo thứ tự kết quả, được sắp xếp theo cột 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)

Bản trình diễn trên SQLFiddle

Tùy chọn với tên các cột như sau "Nhà máy, Thương hiệu, Khu vực1, Thời gian ngừng hoạt động1, Lý do1, Khu vực2, Thời gian ngừng hoạt động2, Lý do2, v.v.".

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) 

Bản trình diễn trên SQLFiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để di chuyển cơ sở dữ liệu SQL Server LocalDb từ máy này sang máy khác?

  2. Cách loại bỏ không gian tab trong cột trong SQL Server 2008

  3. Tại sao 1899-12-30 là ngày 0 trong Access / SQL Server thay vì 12/31?

  4. Tính trung bình giữa các cột bằng cách so sánh hai hàng trong SQL Server

  5. Truy xuất định nghĩa cột cho tập kết quả thủ tục được lưu trữ