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

nhóm và chuyển đổi các cột và hàng

Bạn có thể thực hiện việc này với PIVOT động và ROW_NUMBER() chức năng:

DECLARE @cols AS VARCHAR(1000),
        @query  AS VARCHAR(8000)
SELECT @cols = STUFF((SELECT ',' +   QUOTENAME(Name) 
                    FROM (SELECT DISTINCT Name
                          FROM #test
                          )sub
                    ORDER BY Name
                    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)') 
                    ,1,1,'')
PRINT @cols

SET @query = '
WITH cte AS (SELECT DISTINCT *
             FROM  #test)
    ,cte2 AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Apt)RowRank
             FROM  cte)
SELECT * 
FROM  cte2 
PIVOT (max(Apt) for Name in ('[email protected]+')) p
            '
EXEC (@query)

SQL Fiddle - Danh sách riêng, Thứ tự cụ thể

Chỉnh sửa:Nếu bạn không muốn danh sách khác biệt, hãy loại bỏ cte đầu tiên ở trên và nếu bạn muốn giữ thứ tự tùy ý, hãy thay đổi ORDER BY thành (SELECT 1) :

DECLARE @cols AS VARCHAR(1000),
        @query  AS VARCHAR(8000)
SELECT @cols = STUFF((SELECT ',' +   QUOTENAME(Name) 
                    FROM (SELECT DISTINCT Name
                          FROM #test
                          )sub
                          ORDER BY Name
                    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)') 
                    ,1,1,'')
PRINT @cols

SET @query = '
WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY (SELECT 1))RowRank
             FROM  #test)
SELECT * 
FROM  cte 
PIVOT (max(Apt) for Name in ('[email protected]+')) p
            '
EXEC (@query)

SQL Fiddle - Danh sách đầy đủ, Thứ tự tùy ý

Và cuối cùng, nếu bạn không muốn RowRank trong kết quả của bạn, chỉ cần sử dụng lại @cols trong SELECT của bạn :

SET @query = '
WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY (SELECT 1))RowRank
             FROM  #test)
SELECT '[email protected]+' 
FROM  cte 
PIVOT (max(Apt) for Name in ('[email protected]+')) p
            '
EXEC (@query)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Phát hiện khoảng trống hơn 30 phút trong cột dấu thời gian

  2. 4 Tài nguyên giám sát máy chủ SQL tuyệt vời dành cho quản trị viên cơ sở dữ liệu

  3. Tôi có thể kết hợp bên trong 2 bảng dựa trên nhiều giá trị cho một cột không

  4. ghi tên người dùng trong bộ điều khiển api web khi bảng cơ sở dữ liệu lưu trữ người dùng dưới dạng số nguyên

  5. Thay thế cột nhận dạng từ int thành bigint