2013-09-14 3 views
0

Я хотел бы знать, если это возможно, чтобы перевести таблицу ниже:Перевод таблицы в сводную таблицу

enter image description here

в сводную таблицу, как это?

enter image description here

я попытался запрос ниже, но это не дает мне правильные результаты:

SELECT * FROM 
(
    select 
     WorkWeek 
     , CometsFT 
     , CometsTR 
     , CSP 
     , MaxCIMFT 
     , MaxCIMTR 
     , MaxCIMWS 
     , STD 
    from tblLotTrackingDetails 
) s 
pivot 
(
    sum(cometsft) 
    for WorkWeek in (WW6, WW7, WW8, WW9, WW10) 
)as piv 

ответ

1

Вы должны UNPIVOT таблицу, а затем PIVOT снова

WITH unpivot_details AS 
(
    SELECT WorkWeek, Type, Value 
    FROM 
    ( 
    SELECT WorkWeek, CometsFT, CometsTR, CSP, MaxCIMFT, MaxCIMTR, MaxCIMWS, STD 
     FROM tblLotTrackingDetails 
) s 
    UNPIVOT 
    ( 
    Value FOR Type IN (CometsFT, CometsTR, CSP, MaxCIMFT, MaxCIMTR, MaxCIMWS, STD) 
) s 
) 
SELECT Type RowLabels, 
     WW1, WW2, WW3, WW4, WW5, WW6, WW7, WW8, WW9, WW10 
    FROM 
(
    SELECT WorkWeek, Type, Value 
    FROM unpivot_details 
    UNION ALL 
    SELECT WorkWeek, 'Total', SUM(Value) Value 
    FROM unpivot_details 
    GROUP BY WorkWeek 
) s 
PIVOT 
(
    SUM(Value) FOR WorkWeek IN(WW1, WW2, WW3, WW4, WW5, WW6, WW7, WW8, WW9, WW10) 
) p 
ORDER BY CASE WHEN Type = 'Total' THEN 1 ELSE 0 END, 
      Type 

Выход проб:

 
| ROWLABELS | WW1 | WW2 | WW3 | WW4 | WW5 | WW6 | WW7 | WW8 | WW9 | WW10 | 
|-----------|-----|-----|-----|-----|-----|-----|-----|-----|-----|------| 
| CometsFT | 42 | 50 | 30 | 45 | 25 | 36 | 26 | 33 | 35 | 35 | 
| CometsTR | 20 | 14 | 30 | 28 | 24 | 14 | 21 | 18 | 21 | 9 | 
|  CSP | 6 | 4 | 1 | 7 | 9 | 8 | 8 | 2 | 4 | 3 | 
| MaxCIMFT | 52 | 58 | 105 | 77 | 42 | 39 | 34 | 23 | 34 | 19 | 
| MaxCIMTR | 21 | 2 | 7 | 9 | 34 | 4 | 5 | 7 | 7 | 9 | 
| MaxCIMWS | 28 | 29 | 59 | 82 | 24 | 26 | 19 | 20 | 40 | 21 | 
|  STD | 3 | 40 | 2 | 8 | 2 | 5 | 5 | 2 | 9 | 2 | 
|  Total | 172 | 197 | 234 | 256 | 160 | 132 | 118 | 105 | 150 | 98 | 

Вот SQLFiddle демо


UPDATE на основе ваших комментариев. Этот запрос будет тянуть данные за 11 недель до 15.

WITH unpivot_details AS 
(
    SELECT WorkWeek, Type, Value 
    FROM 
    ( 
    SELECT WorkWeek, CometsFT, CometsTR, CSP, MaxCIMFT, MaxCIMTR, MaxCIMWS, STD 
     FROM tblLotTrackingDetails 
    WHERE WorkWeek IN ('WW11', 'WW12', 'WW13', 'WW14', 'WW15') 
) s 
    UNPIVOT 
    ( 
    Value FOR Type IN (CometsFT, CometsTR, CSP, MaxCIMFT, MaxCIMTR, MaxCIMWS, STD) 
) s 
) 
SELECT Type RowLabels, 
     WW11, WW12, WW13, WW14, WW15 
    FROM 
(
    SELECT WorkWeek, Type, Value 
    FROM unpivot_details 
    UNION ALL 
    SELECT WorkWeek, 'Total', SUM(Value) Value 
    FROM unpivot_details 
    GROUP BY WorkWeek 
) s 
PIVOT 
(
    SUM(Value) FOR WorkWeek IN(WW11, WW12, WW13, WW14, WW15) 
) p 
ORDER BY CASE WHEN Type = 'Total' THEN 1 ELSE 0 END, 
      Type 

Вот SQLFiddle демо

+0

+1 за то, что уделил время созданию рабочей демонстрации sqlfiddle, когда структура таблицы отображается в изображении в вопросе. – hims056

+0

спасибо peterm. это работает фантастично! я хотел бы знать, можно ли также отображать последние 5 рабочих часов? Я добавил рабочие недели с 11 до 15. Могу ли я просто показать последние 5? – GianIsTheName

+0

@GianIsTheName. Вы очень желанны. Я рад, что смогу помочь :) Теперь да, вы можете отображать последние 5 недель, но вы должны переписать свой запрос, чтобы разместить это (поскольку это статический запрос), добавляя предложение WHERE в CTE и изменяя значения в 'SELECT' и Предложение 'IN' в' PIVOT'. Или вы можете отказаться от динамического SQL, чтобы построить строку запроса «на лету», а затем выполнить ее с помощью «EXEC». – peterm

0

Наконец, после многих попыток, я был в состоянии сделать то, что я хотел сделать. предложение петерма сработало. Для совместного использования ниже приведен динамический стержень, который я буду использовать:

DECLARE @Columns NVARCHAR(MAX) 
     ,@query NVARCHAR(MAX) 
SELECT @Columns = STUFF(
(SELECT ', ' +'['+WorkWeek+']' FROM 
(SELECT TOP 10 WorkWeek FROM(SELECT TOP 10 WorkWeek , LotTrackingID FROM tblLotTracking ORDER BY LotTrackingID DESC) s Order by s.LotTrackingID) AS T FOR XML PATH('')),1,2,'') 

SET @query = N'WITH unpivot_details AS 
(
    SELECT WorkWeek, Type, Value 
    FROM 
    ( 
    SELECT WorkWeek, CometsFT, CometsTR, CSP, MaxCIMFT, MaxCIMTR, MaxCIMWS, STD 
     FROM tblLotTrackingDetails 
) s 
    UNPIVOT 
    ( 
    Value FOR Type IN (CometsFT, CometsTR, CSP, MaxCIMFT, MaxCIMTR, MaxCIMWS, STD) 
) s 
) 
SELECT Type RowLabels, 
     ' + @Columns + ' 
    FROM 
(
    SELECT WorkWeek, Type, Value 
    FROM unpivot_details 
    UNION ALL 
    SELECT WorkWeek, ''Total'', SUM(Value) Value 
    FROM unpivot_details 
    GROUP BY WorkWeek 
) s 
PIVOT 
(
    SUM(Value) FOR WorkWeek IN(' + @Columns + ') 
) p 
ORDER BY CASE WHEN Type = ''Total'' THEN 1 ELSE 0 END, 
      Type'; 
EXEC sp_executesql @query; 
Смежные вопросы