PIVOT / UNPIVOT более одного столбца - PullRequest
0 голосов
/ 02 января 2019

Есть ли способ использовать SQL Pivot / Unpivot для получения вывода под Converted ниже из таблицы Original?

enter image description here

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Вы можете добиться «преобразованного» макета с помощью динамического sql, но помните о проблемах производительности и безопасности этого подхода.

Более того, как сказал Таб Аллеман в своем ответе, это явно работа для презентации.layer.

Если вы все еще хотите сделать это в SQL Server, вот возможное решение:

CREATE TABLE [dbo].[Test] (
     [id]     int
    ,[type]   varchar(50)
    ,NBR      varchar(50)
    ,c1_pos   int
    ,c1_neg   int
    ,c2_pos   int
    ,c2_neg   int   )

INSERT INTO [dbo].[Test]
values 
 (8375, 'Type #1', 'P #1', 1, 0, 0, 0)
,(8375, 'Type #2', 'P #2', 0, 1, 0, 0)
,(8375, 'Type #3', 'P #1', 0, 1, 0, 0)
,(8375, 'Type #4', 'P #1', 1, 0, 0, 0)
,(8375, 'Type #5', 'P #1', 0, 0, 0, 0)

--this variable holds the value that will become the header of the first column 
declare @first_column_header nvarchar(10)
--this variable holds all the dates that will become column names 
declare @headers nvarchar(max)=''
--this variable contains the TSQL dinamically generated 
declare @sql nvarchar(max)=''  

SELECT @first_column_header = max(id) FROM [dbo].[Test]  group by [id]
select @headers = @headers + ', ' + QUOTENAME([type]) from [dbo].[Test] 
set @headers = RIGHT(@headers, len(@headers) - 2) 

set @sql = @sql + 'select piv.col as ' + QUOTENAME(@first_column_header) + ', ' + @headers + ' ' 
set @sql = @sql + 'from ' 
set @sql = @sql + '( ' 
set @sql = @sql + ' select [type], col, val, ord ' 
set @sql = @sql + ' from [dbo].[Test] ' 
set @sql = @sql + ' CROSS APPLY (' 
set @sql = @sql + '  VALUES (''NBR''    , cast(NBR    as varchar(10)) , 1), ' 
set @sql = @sql + '         (''c1_pos'' , cast(c1_pos as varchar(10)) , 2), ' 
set @sql = @sql + '         (''c1_neg'' , cast(c1_neg as varchar(10)) , 3), ' 
set @sql = @sql + '         (''c2_pos'' , cast(c2_pos as varchar(10)) , 4), ' 
set @sql = @sql + '         (''c2_neg'' , cast(c2_neg as varchar(10)) , 5) ' 
set @sql = @sql + ' )CS (col, val, ord) ' 
set @sql = @sql + ') src ' 
set @sql = @sql + 'pivot ( max(val) for [type] in (' + @headers + ') ) piv ' 
set @sql = @sql + 'order by ord' 

exec(@sql)

Результат:

enter image description here

0 голосов
/ 02 января 2019

Нет, нет варианта PIVOT / UNPIVOT, который позволил бы вам создать эту первую строку в вашем «преобразованном» выводе, с id в одном столбце и значениями type для каждого из других столбцов.

Это потребует некоторого пользовательского выбора для создания первой строки, а затем UNION с UNPIVOT для создания остальных строк.

Поскольку агрегирование не выполняется, я не будузнаю, почему вы хотите сделать это в SQL.Лично я бы сделал это на уровне представления.

...