Превратить столбцы в ряды - PullRequest
0 голосов
/ 05 июля 2018

У меня есть такая таблица:

CFL52_ID     CFL52_PRICE    CFL51_MILEAGE
------------ --------------- -----------------
1            100000.00       10000
1            200000.00       20000
2            800000.00       10000
2            900000.00       20000

Я хочу развернуть столбцы в строки. Mileage было заголовком столбца и Price значением. Превращаясь во что-то вроде этого:

CFL52_ID     [10000]         [20000]
------------ --------------- -----------------
1            100000.00       200000.00
2            800000.00       900000.00

Обратите внимание, что идентификатор группировался, цены меняются, а пробег превращается в заголовок столбца, пробег является динамическим-может увеличиваться-.

Я безуспешно пытался с этим:

   SELECT  [10000],[20000]   
    FROM  (     SELECT 
                    CFL52_PRICE as indicatorvalue,          
                    CFL51_MILEAGE as indicatorname        
                FROM [TFL52_PRICES_M] p          
                    INNER JOIN [TFL51_PARAM_MILEAGE] k ON CFL52_CFL51_CODIGO = CFL51_CODIGO       
                WHERE CFL52_DATES = '2018-07-01 00:00:00.000' AND CFL52_DATEEN= '2018-07-02 00:00:00.000') as a   
    pivot 
    (
        max(indicatorvalue) for indicatorname in ([10000],[20000]) 
    ) p

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

Для управления динамическими заголовками необходим динамический TSQL:

if OBJECT_ID('dbo.test') is null 
create table dbo.test(CFL52_ID varchar(50), CFL52_PRICE decimal(18,2), CFL51_MILEAGE int) 
--populate test table
insert into dbo.test values 
(1, 100000.00, 10000), 
(1, 200000.00, 20000), 
(2, 800000.00, 10000), 
(2, 900000.00, 20000)

declare @columns nvarchar(max)='' --holds all the numbers that will become column names 
declare @sql nvarchar(max)='' --contains the TSQL dinamically generated 

--generate dynamic column names
select @columns = @columns + ', [' + cast(CFL51_MILEAGE as varchar(max))+ ']' 
from dbo.test 
group by CFL51_MILEAGE 

--remove first (unnecessary) comma
set @columns = RIGHT(@columns, len(@columns)-2) 

--build dynamic TSQL query
set @sql = @sql + ' select piv.[CFL52_ID], ' + @columns 
set @sql = @sql + ' from ( ' 
set @sql = @sql + ' select [CFL52_ID], [CFL52_PRICE], [CFL51_MILEAGE] ' 
set @sql = @sql + ' from dbo.test ' 
set @sql = @sql + ' ) src ' 
set @sql = @sql + ' pivot ( ' 
set @sql = @sql + ' max([CFL52_PRICE]) ' 
set @sql = @sql + ' for [CFL51_MILEAGE] in ('+@columns+') ' 
set @sql = @sql + ' ) piv ' 

--execute  dynamic TSQL query
exec(@sql)

выход:

enter image description here

Если вы добавите больше строк в вашу таблицу ввода со значениями CFL51_MILEAGE 10000 и 20000, то таблицы ввода и вывода будут:

enter image description here

Если вы добавите больше строк во входную таблицу, введя новые значения CFL51_MILEAGE (отличные от 10000 или 20000), тогда таблицы ввода и вывода будут:

enter image description here

0 голосов
/ 05 июля 2018

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

select CFL52_ID
    , [10000] = MAX(case when CFL51_MILEAGE = 10000 then CFL52_PRICE end)
    , [20000] = MAX(case when CFL51_MILEAGE = 20000 then CFL52_PRICE end)
FROM [TFL52_PRICES_M] p          
INNER JOIN [TFL51_PARAM_MILEAGE] k ON CFL52_CFL51_CODIGO = CFL51_CODIGO       
WHERE CFL52_DATES = '2018-07-01 00:00:00.000' 
    AND CFL52_DATEEN= '2018-07-02 00:00:00.000'
group by CFL52_ID
...