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

Truy vấn sql cho Transpose của một bảng động

Trong trường hợp của bạn, bạn nên bỏ chia các cột Salary, NoticePeriod, CTC thành hàng, rồi đến PIVOT :

WITH Unpivoted
AS
(
    SELECT Name, Fields, SalaryValue
    FROM salaries AS s
    UNPIVOT
    (
      SalaryValue
      FOR  Fields IN(Salary, NoticePeriod, CTC)
    ) AS u
)
SELECT Fields, jack,bruce
FROM Unpivoted AS u
PIVOT
(
  MAX(SalaryValue)
  FOR Name IN(Jack, Bruce)
) AS p;

UNPIVOT sẽ chuyển đổi các cột Salary, NoticePeriod, CTC thành các giá trị:

Sau đó, pivot sẽ xoay các giá trị lương cho từng giá trị trường và chuyển đổi tên thành các cột.

Và tất nhiên bạn phải làm điều đó một cách linh động thay vì viết danh sách các tên như thế này:

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @colnames AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

SELECT @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(name)
                       FROM salaries
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');


SELECT @query = 'WITH Unpivoted
                AS
                (
                    SELECT Name, Fields, SalaryValue
                    FROM salaries AS s
                    UNPIVOT
                    (
                        SalaryValue
                        FOR  Fields IN(Salary, NoticePeriod, CTC)
                    ) AS u
                )
                SELECT Fields, ' + @cols + '
                FROM Unpivoted AS u
                PIVOT
                (
                    MAX(SalaryValue)
                    FOR Name IN(' + @cols + ')' +
                ') p';

execute(@query);

Điều này sẽ cung cấp cho bạn:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thực thi truy vấn SSRS không thành công cho tập dữ liệu

  2. Bảng nhỏ SQL được phân bổ trong bộ nhớ

  3. Làm cách nào để chuyển đổi DateTimeOffset của Sql Server 2008 thành DateTime

  4. Sử dụng cơ sở dữ liệu bên trong một thủ tục được lưu trữ

  5. SQL Server và các lỗ hổng Spectre / Meltdown