2015-05-21 4 views
1

Мне нужно сгладить набор записей, который изначально имеет 4 строки на пользователя для 1 строки. Я начал использовать функциональность PIVOT, но есть 2 поля, которые нужно сгладить (и ось не работает должным образом).Строки строк SQL Server 2008

Текущая структура данных:

ContactEmail  Scenario TRE  Updated_On 
    ------------------------------------------------------------- 
    [email protected] WTD   0.9785 2015-05-12 22:35:14.993 
    [email protected] MTD   0.9817 2015-05-12 22:35:57.780 
    [email protected] QTD   0.9542 2015-05-12 23:16:35.227 
    [email protected] YTD   0.9522 2015-05-12 23:39:56.533 

Результат должен быть:

ContactEmail  WTD_TRE WTD_TRE_Updated MTD_TRE MTD_TRE_Updated QTD_TRE QTD_TRE_Updated YTD_TRE YTD_TRE_Updated 
    -------------------------------------------------------------------------------------------------------------------- 
    [email protected] 0.9785 2015-05-12  0.9817 2015-05-12  0.9542 2015-05-12  0.9522 2015-05-12 

Если вам интересно о PIVOT я попробовал, здесь есть (TRE_ * были нуль)

SELECT * 
    FROM (SELECT ContactEmail, Round((ISNULL(TRE, 0) * 100), 1) AS "TRE", Scenario, Updated_On 
     FROM [server].[db].[schema].[table]) AS TREData 
    PIVOT 
    (
    SUM(TRE) 
    FOR Scenario 
    IN ([TRE_WTD],[TRE_MTD],[TRE_QTD],[TRE_YTD])  
) AS PivotTable; 
+0

'TRE_WTD' не является значением' Scenario', я думаю, вам нужно использовать 'FOR Scenario IN ([WTD], [MTD] ..)' – NickyvV

ответ

1

Создание двух сводных запросов и присоединиться к ним ...

WITH CurrentDataStructure as (
    SELECT '[email protected]' ContactEmail, 
      'WTD' Scenario, 
      0.9785 TRE, 
      '2015-05-12 22:35:14.993' Updated_On 
    UNION SELECT '[email protected]', 'MTD', 0.9817, '2015-05-12 22:35:57.780' 
    UNION SELECT '[email protected]', 'QTD', 0.9542, '2015-05-12 23:16:35.227' 
    UNION SELECT '[email protected]', 'YTD', 0.9522, '2015-05-12 23:39:56.533' 
), TREData as (
    SELECT ContactEmail, Round((ISNULL(TRE, 0) * 100), 1) TRE, Scenario, Updated_On 
    FROM CurrentDataStructure 
), TREs AS (
    SELECT * 
     FROM (SELECT ContactEmail, Scenario, TRE FROM TREData) TREData 
    PIVOT 
    (
     SUM(TRE) 
     FOR Scenario 
     IN ([WTD],[MTD],[QTD],[YTD])  
    ) PivotTable 
), TREsUpdated AS (
    SELECT * 
     FROM (SELECT ContactEmail, Scenario, Updated_On FROM TREData) TREData 
    PIVOT 
    (
     MAX(Updated_On) 
     FOR Scenario 
     IN ([WTD],[MTD],[QTD],[YTD])  
    ) PivotTable 
) 

SELECT t.ContactEmail, 
    t.WTD WTD_TRE, u.WTD WTD_TRE_Updated, 
    t.MTD MTD_TRE, u.MTD MTD_TRE_Updated, 
    t.QTD QTD_TRE, u.QTD QTD_TRE_Updated, 
    t.YTD YTD_TRE, u.YTD YTD_TRE_Updated 
FROM TREs as t 
    INNER JOIN 
TREsUpdated as u 
    ON t.ContactEmail = u.ContactEmail 

Это проверено и должно работать так же, как оно есть.