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:
- Bản trình diễn trực tiếp (Cảm ơn @ lad2025 vì nó)