2015-10-20 2 views
0

таблицы SQL выглядит следующим образом,SQL-запрос для Транспонирования динамической таблицы

Name Salary NoticePeriod CTC 
    Jack  1520  15   123 
    Bruce 1423  35   165 

и содержит около 1000 строк.

мне нужно сделать транспонирование этой таблицы, так что ожидаемый выход

Fields   Jack  Bruce Mike ..... Sam 
    Salary   1520  1423 235 .. 561 
    NoticePeriod  15  35  23  253 
    CTC    123  165  45 ... 125 

Я попытался с помощью Pivot и функции UNPIVOT в Sql Server 2008. Но так как запись имени велика, Pivot-запрос не помогает.

является следующим My SQL попытки

SELECT * 
FROM (
    SELECT NAME, 
    Salary, 
    NoticePeriod, 
    CTC 
    FROM CTCTABLE WITH (NOLOCK) 
) AS queryTable 
UNPIVOT(Value FOR NAME IN (NAME, Salary, NoticePeriod, CTC)) AS unpv 
PIvot(max(Value) FOR NAME IN (Salary, NoticePeriod, CTC)) pv 
+0

Поделитесь, что вы пробовали до сих пор, во всяком случае. – lad2025

+2

Возможный дубликат [SQL Server dynamic PIVOT query?] (Http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) –

ответ

2

В вашем случае, вы должны UNPIVOT столбцов 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 в значение:

enter image description here

Затем стержень будет поворачивать значения зарплаты для каждого значения поля и преобразовывать имена в столбцы.

И, конечно, вы должны сделать это динамически вместо того, чтобы писать список имен, как это:

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

Это даст вам:

enter image description here

+0

На всякий случай, если кто-то хочет играть с ним https: // data.stackexchange.com/stackoverflow/query/377813 – lad2025

+1

@ lad2025 - Спасибо за демонстрацию –

+0

Спасибо всем за ваши усилия. Но Джек был первой записью, вставленной в базовый стол. Когда Pivot и Unpivot были сделаны, столбец Брюса пришел первым, и Джек пришел. Невозможно изменить порядок столбцов на основе порядка внесения записей в таблицу. –

Смежные вопросы