Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Requête SQL pour transposer un tableau dynamique

Dans votre cas, vous devez dépivoter les colonnes Salary, NoticePeriod, CTC en lignes, puis 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;

Le UNPIVOT transformera les colonnes Salary, NoticePeriod, CTC en valeurs :

Ensuite, le pivot fera pivoter les valeurs de salaire pour chaque valeur de champ et transformera les noms en colonnes.

Et bien sûr, vous devez le faire dynamiquement au lieu d'écrire une liste de noms comme celle-ci :

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

Cela vous donnera :