2014-11-27 2 views
0

Таблица: Образецзначения PIVOT из двух столбцов в несколько столбцов

ID  Day Status MS 
---------------------------- 
1  1  0  10 
1  2  0  20 
1  3  1  15 
2  3  1  3 
2  30  0  5 
2  31  0  6 

Ожидаемый результат:

ID Day1 Day2 Day3....Day30 Day31 Status1 Status2 Status3...Status30 Status31 
--------------------------------------------------------------------------------------- 
1 10 20 15  NULL NULL  0  0  1   NULL  NULL 

2 NULL NULL 3  5  6  NULL  NULL  1   0   0 

Я хочу, чтобы получить значение MS and Status на каждый день от 1 до 31 для каждый идентификатор.

Я использовал PIVOT, чтобы получить нижеследующий результат.

Результат:

ID Day1 Day2 Day3....Day30 Day31 
------------------------------------- 
1 10 20 15  NULL NULL 

2 NULL NULL 3  5  6 

Запрос:

SELECT 
    ID 
    ,[1]  AS Day1 
    ,[2]  AS Day2 
    ,[3]  AS Day3 
     . 
     . 
     . 
    ,[30] AS Day30 
    ,[31] AS Day31 
FROM 
(
    SELECT 
     ID 
     ,[Day] 
     ,MS 
    FROM 
     Sample 
) AS A 
PIVOT 
(
    MIN(MS) 
    FOR [Day] IN([1],[2],[3],...[30],[31]) 
) AS pvtTable 

Как я могу объединить столбец Status с результатом ?.

+0

просто рассмотреть результат, который вы получили в качестве одного из таблицы «t1» и создать то же самое со второй вариант т.е. со статусом «t2» и присоединиться к нему с идентификатором – brykneval

+0

Я попробовал то, что вы сказали. Но есть ли возможность сделать это с единственным PIVOT. –

ответ

2

Попробуйте это. Использовать другой Pivot до транспонированиеStatus колонка. Затем используйте агрегат (Max или Min) в списке списка столбцов с группой по Id, чтобы получить результат.

CREATE TABLE #est 
    (ID INT,[Day] INT,[Status] INT,MS INT) 

INSERT #est 
VALUES (1,1,0,10),(1,2,0,20),(1,3,1,15), 
     (2,3,1,3),(2,30,0,5),(2,31,0,6) 


SELECT ID, 
     Max([Day1]) [Day1], 
     Max([Day2]) [Day2], 
     Max([Day3]) [Day3], 
     Max([Day30]) [Day30], 
     Max([Day31]) [Day31], 
     Max([status1]) [status1], 
     Max([status2]) [status2], 
     Max([status3]) [status3], 
     Max([status30])[status30], 
     Max([status31])[status31] 
FROM (SELECT Id, 
       'status' + CONVERT(VARCHAR(30), Day) col_stat, 
       'Day' + CONVERT(VARCHAR(30), Day) Col_Day, 
       [status], 
       ms 
     FROM #est) a 
     PIVOT (Min([ms]) 
      FOR Col_Day IN([Day1],[Day2],[Day3],[Day30],[Day31])) piv 
     PIVOT (Min([status]) FOR col_stat IN ([status1],[status2],[status3],[status30],[status31])) piv1 
GROUP BY id 
Смежные вопросы