Для управления динамическими заголовками необходим динамический 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](https://i.stack.imgur.com/gRUlO.png)
Если вы добавите больше строк в вашу таблицу ввода со значениями CFL51_MILEAGE
10000 и 20000, то таблицы ввода и вывода будут:
![enter image description here](https://i.stack.imgur.com/zzDgm.png)
Если вы добавите больше строк во входную таблицу, введя новые значения CFL51_MILEAGE
(отличные от 10000 или 20000), тогда таблицы ввода и вывода будут:
![enter image description here](https://i.stack.imgur.com/OytO5.png)