Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Sql заявка за транспониране на динамична таблица

Във вашия случай трябва да отмените завъртането на колоните 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);

Това ще ви даде:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо този CTE е толкова по-бавен от използването на временни таблици?

  2. SQL Server - ПРЕДИ INSERT Trigger

  3. Функция в SQL Server 2008, подобна на НАЙ-ГОЛЯМАТА в mysql?

  4. Грешка на SQL Server:Не може да се изпълни отдалечена процедура

  5. вземете само последния ред в множеството записи за всеки ден в TSQL