Относительно SQL Pivot - PullRequest
       34

Относительно SQL Pivot

0 голосов
/ 22 октября 2018

Привет Я пытался сделать PIVOT для следующих данных.

LeaseId | ColumnHeader  | UIPayments | UIResidual
-------------------------------------------------
25573   | 2019-05-01    | 0.0000     | 0.0000    
25573   | 2019-06-01    | 0.0000     | 0.0000    
25573   | 2019-07-01    | 0.0000     | 0.0000    
25573   | 2019-08-01    | 0.0000     | 0.0000    
25573   | 2019-09-01    | 0.0000     | 0.0000    
25573   | 2019-10-01    | 0.0000     | 0.0000   

Результирующий набор данных должен выглядеть следующим образом:

LeaseId |Details    | 2019-05-01| 2019-06-01|2019-07-01 |2019-08-01
-----------------------------------------------------------------                
25573   |UIPayments |5.0000     |5.0000     |5.0000     |5.0000

25573   |UIResidual |1.0000     |1.0000     |1.0000     |1.0000

Возможно ли это?

Заранее спасибо.

Запрос, который я пробовал до сих пор:

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',[' + CAST(DATEFROMPARTS(#TempMonths.y, #TempMonths.m, '01') AS VARCHAR(20)) + ']'
                from #TempMonths
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @query = 'SELECT LeaseID, UIPayments, UIResidual, PVResidual, PVPayments, NetInvestment,' + @cols + ' from 
         (
            SELECT * FROM #TmpDetails
        ) x
        pivot 
        (
            UIPayments, UIResidual, PVResidual, PVPayments, NetInvestment
            for ColumnHeader in (' + @cols + ')
        ) p '

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

Заранее спасибо!

1 Ответ

0 голосов
/ 22 октября 2018

Условное агрегирование должно работать практически в любой базе данных:

select LeaseId, 'UIPayments' as details,
       sum(case when ColumnHeader = '2019-05-01' then UIPayments else 0 end) as val_20190501,
       sum(case when ColumnHeader = '2019-06-01' then UIPayments else 0 end) as val_20190601,
       sum(case when ColumnHeader = '2019-07-01' then UIPayments else 0 end) as val_20190701,
       sum(case when ColumnHeader = '2019-08-01' then UIPayments else 0 end) as val_20190801
from t
group by LeaseId
union all
select LeaseId, 'UIResidual' as details,
       sum(case when ColumnHeader = '2019-05-01' then UIResidual else 0 end) as val_20190501,
       sum(case when ColumnHeader = '2019-06-01' then UIResidual else 0 end) as val_20190601,
       sum(case when ColumnHeader = '2019-07-01' then UIResidual else 0 end) as val_20190701,
       sum(case when ColumnHeader = '2019-08-01' then UIResidual else 0 end) as val_20190801
from t
group by LeaseId;

Я полагаю, хитрость заключается в том, что вам нужно обрабатывать каждый столбец отдельно.Во многих базах данных вы можете сделать это, используя боковое соединение, а не union all.

...