2016-09-28 5 views
1

Мне нужна помощь с моим запросом при повороте нескольких столбцов, в основном, мне просто нужен простой запрос, и я не могу обойти его, надеюсь, кто-то может мне помочь.TSQL - Развернуть несколько столбцов

Unpivoted:

MTH   ID  TEAM Metric_ID Score Outcome_Score 
1/10/2016 abc11 teamA ID_1  292  3 
1/11/2016 abc11 teamA ID_1  300  0 
1/10/2016 abc11 teamA ID_10  100  0 
1/11/2016 abc11 teamA ID_10  84  0 
1/10/2016 abc11 teamA ID_11  11%  0 
1/11/2016 abc11 teamA ID_11  12%  0 

БЫТЬ:

LANID TEAM Metric_ID Oct_Score Oct_Outcome_Score Nov_Score Nov_Outcome_Score 
abc11 teamA ID_1  292   3     300   0 
abc11 teamA ID_10  100   0     84   0 
abc11 teamA ID_11  11%   0     12%   0 

я пришел с ниже, но каждый раз, когда я добавляю поле для Результата, это портит запрос вообще. Фактический запрос более сложный. Мне просто нужна идея. Благодарю.

SELECT   ID AS LANID, Team, Metric_ID 
       , CONVERT(varchar(3), MTH, 100) SMTH 
       , Oct_Score 
       , Oct_Outcome_Score 
       , Nov_Score 
       , Nov_Outcome_Score 
FROM   TableA 
PIVOT 
    (
       SUM(Score) 
       FOR SMTH IN (Oct_Score, Nov_Score) 
    ) AS P 
+0

Было бы гораздо быстрее, для людей, чтобы помочь, если вы бы обеспечить структуру образца таблицы и ее заселяющий сценарий. –

+0

Я считаю, что образца достаточно? – lucas

+0

Соотношение% в процентах? –

ответ

0

Наконец, это было решено. Причина отсутствует «GROUP BY», поэтому данные удваиваются/утроиваются в зависимости от количества поворотных столбцов.

For reference, pls refer on this link.

1

Это должно работать:

WITH Src AS 
(
    SELECT * FROM (VALUES 
    ('1/10/2016', 'abc11', 'teamA', 'ID_1 ', 292, 3), 
    ('1/11/2016', 'abc11', 'teamA', 'ID_1 ', 300, 0), 
    ('1/10/2016', 'abc11', 'teamA', 'ID_10', 100, 0), 
    ('1/11/2016', 'abc11', 'teamA', 'ID_10', 84, 0), 
    ('1/10/2016', 'abc11', 'teamA', 'ID_11', 11, 0), 
    ('1/11/2016', 'abc11', 'teamA', 'ID_11', 12, 0) 
    )T(MTH, ID, TEAM, Metric_ID, Score, Outcome_Score) 
) 
SELECT * FROM 
(
    SELECT ID, TEAM, Metric_ID, Value, 
     CASE WHEN DATEPART(M, MTH)=10 THEN 'Oct_' 
      WHEN DATEPART(M, MTH)=11 THEN 'Nov_' END+Col ToPivot 
    FROM 
    (SELECT CONVERT(date, MTH, 103) MTH, ID, TEAM, Metric_ID, Score, Outcome_Score FROM Src) T1 
    UNPIVOT (Value FOR Col IN (Score, Outcome_Score)) U1 
) T 
PIVOT (SUM(Value) FOR ToPivot IN (Oct_Score, Oct_Outcome_Score, Nov_Score, Nov_Outcome_Score)) P 

Результат:

ID TEAM Metric_ID Oct_Score Oct_Outcome_Score Nov_Score Nov_Outcome_Score 
----- ----- --------- ----------- ----------------- ----------- ----------- 
abc11 teamA ID_1  292   3     300   0 
abc11 teamA ID_10  100   0     84   0 
abc11 teamA ID_11  11   0     12   0 
+0

Привет, Павел, это отличное решение, однако мне нужен запрос, который более динамичен, поскольку я имею дело с 12-месячным столбцом и метрикой от ID_1 до по меньшей мере ID180. – lucas

+0

Что делать, если месяцы охватывают два разных года? Метрика не используется в 'PIVOT/UNPIVOT', нет необходимости делать это динамически. –

1

Для Dynamic Pivot можно использовать сильфон запрос (В Dynamic Pivot Column Name не будет в надлежащем порядке)

CREATE Table #Item(id varchar(250),team varchar(250),Metric_ID varchar(20),col varchar(250),Score int) 
;WITH Src AS(SELECT * FROM (VALUES ('10/1/2016', 'abc11', 'teamA', 'ID_1 ', 292, 3),('11/1/2016', 'abc11', 'teamA', 'ID_1 ', 300, 0),('10/1/2016', 'abc11', 'teamA', 'ID_10', 100, 0),('11/1/2016', 'abc11', 'teamA', 'ID_10', 84, 0),('10/1/2016', 'abc11', 'teamA', 'ID_11', 11, 0),('11/1/2016', 'abc11', 'teamA', 'ID_11', 12, 0))T(MTH,ID, TEAM, Metric_ID, Score, Outcome_Score)) 
INSERT INTO #Item 
select ID,TEAM,Metric_ID,DateName(M, DateAdd(M, MONTH(MTH), -1))+'_Score',Score from Src 
UNION ALL 
select ID,TEAM,Metric_ID,DateName(M, DateAdd(M, MONTH(MTH), -1))+'_Outcome_Score',Outcome_Score from Src 
DECLARE @Query AS NVARCHAR(MAX) DECLARE @ColumnName AS NVARCHAR(MAX) 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') + QUOTENAME(col) 
FROM (SELECT DISTINCT col FROM #Item) AS ColName 
SET @Query = N'SELECT ID,TEAM,Metric_ID ,' + @ColumnName + 'FROM #Item PIVOT(SUM(Score) FOR col IN (' + @ColumnName + ')) AS PVTTable' 
EXEC sp_executesql @Query 
Drop table #Item 
Смежные вопросы