आपके मामले में, आपको Salary, NoticePeriod, CTC
कॉलम को अनपिवट करना चाहिए पंक्तियों में, फिर 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
कॉलम को बदल देगा Salary, NoticePeriod, CTC
मूल्यों में:
फिर पिवट प्रत्येक फ़ील्ड मान के लिए वेतन मानों को पिवट करेगा और नामों को कॉलम में बदल देगा।
और निश्चित रूप से आपको नामों की सूची लिखने के बजाय इसे गतिशील रूप से करना होगा:
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);
यह आपको देगा:
- लाइव डेमो (इसके लिए @lad2025 को धन्यवाद)