sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-fråga för Transponering av en dynamisk tabell

I ditt fall bör du avpivotera kolumnerna Salary, NoticePeriod, CTC i rader och sedan 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 kommer att omvandla kolumnerna Salary, NoticePeriod, CTC till värden:

Sedan kommer pivoten att pivotera lönevärdena för varje fältvärde och omvandla namnen till kolumner.

Och självklart måste du göra det dynamiskt istället för att skriva en lista med namn så här:

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);

Detta ger dig:




  1. NHibernate Postgresql DateTime to Time Conversion

  2. Hur sanerar man indata med PHP och sqlsrv-drivrutinen?

  3. Hur grupperar jag på kontinuerliga intervall

  4. NLSSORT() Funktion i Oracle