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

Chuyển đổi dữ liệu hàng thành cột trong SQL Server

Bạn có thể thêm một số hàng vào tên thuộc tính để cho phép bạn làm những gì bạn muốn:

SELECT * FROM
(
SELECT ENTITYID
       , PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5))
      ,PROPERTYVALUE
FROM #STAGING   
) AS T
PIVOT (MAX(PROPERTYVALUE) FOR PROPERTYNAME IN (NAME1, SPOUSE1, CHILD1, CHILD2, CHILD3, CHILD4, CHILD5)) AS T2

Tôi giả sử ở đây rằng ENTITYID liên kết con cái với cha mẹ, tức là tất cả con cái của cùng một người đều có ENTITYID là 1, nhưng ví dụ của bạn cho thấy Kayala là 2.

Đây là bản trình diễn: SQL Fiddle

Nếu bạn chỉ muốn các số cho các trường CON, bạn có thể đặt sau:

PROPERTYNAME = CASE WHEN PROPERTYNAME LIKE '%CHILD%' THEN PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5))                                                   ELSE PROPERTYNAME END

Sau đó, xóa số khỏi các trường khác trong câu lệnh IN () của bạn.

Câu hỏi thưởng- Thực hiện động ở trên: Chúng tôi không muốn cho rằng mọi người chỉ có một vợ / chồng hoặc 2,3 đứa con, vì vậy chúng tôi thực hiện toàn bộ một cách linh động:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SELECT @cols = STUFF((SELECT ',' + PROPERTYNAME
                    FROM (SELECT DISTINCT PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5))
                          FROM STAGING )sub
                    ORDER BY CASE WHEN PROPERTYNAME LIKE '%NAME%' THEN 1
                        WHEN PROPERTYNAME LIKE '%SPOUSE%' THEN 2
                        WHEN PROPERTYNAME LIKE '%CHILD%' THEN 3
                    ELSE 4
                    END
                    ,RIGHT(PROPERTYNAME,1) 
                  FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


SET @query = 'SELECT * FROM
                (
                SELECT ENTITYID, PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5)),PROPERTYVALUE
                FROM STAGING   
                ) AS T
                PIVOT (MAX(PROPERTYVALUE) FOR PROPERTYNAME IN ('[email protected]+')) AS T2

'
EXEC(@query)

Lưu ý:Việc đặt hàng sẽ chỉ áp dụng cho vợ chồng 1-9 và con 1-9, bạn có thể điều chỉnh cho phù hợp, nhưng tùy ý.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL NOT IN có thể có vấn đề về hiệu suất

  2. Không thể thấy trình kích hoạt mà tôi đã tạo trong SQL Server Management Studio 2008

  3. Chuyển đổi chuỗi được phân tách bằng dấu phẩy thành nhiều cột trong máy chủ sql

  4. Câu lệnh ghép t-SQL gây ra bế tắc, bất kỳ ý kiến ​​nào tại sao?

  5. Giới thiệu về các hàm do người dùng xác định trong SQL Server