Транспонировать строки в столбцы, где транспонированный столбец изменяется на основе другого столбца - PullRequest
1 голос
/ 13 июня 2019

Я хочу переместить строки в столбцы, используя функцию Pivot в Oracle и / или SQL Server, используя функцию Pivot. Мой пример использования очень похож на этот Эффективно конвертировать строки в столбцы в SQL Server Тем не менее, я организую данные по определенному типу данных (ниже StringValue и NumericValue показано).

Это мой пример:

   ----------------------------------------------------------------------
   | Id | Person_ID | ColumnName     | StringValue  | NumericValue      |
   ----------------------------------------------------------------------
   | 1  |     1     |  FirstName     |  John        |    (null)         |
   | 2  |     1     |  Amount        |  (null)      |     100           |
   | 3  |     1     |  PostalCode    |  (null)      |    112334         |
   | 4  |     1     |  LastName      |  Smith       |      (null)       |
   | 5  |     1     |  AccountNumber |   (null)     |     123456        |
   ----------------------------------------------------------------------

Это мой результат:

---------------------------------------------------------------------
| FirstName  |Amount|   PostalCode   |   LastName  |  AccountNumber |
---------------------------------------------------------------------
| John       | 100  |   112334       |   Smith     |  123456        |
---------------------------------------------------------------------

Как я могу построить SQL-запрос?

Я уже пытался использовать операторы MAX (DECODE ()) и CASE в Oracle. Однако производительность очень плохая. Посмотрим, сможет ли функция Pivot в Oracle и / или SQL-сервере сделать это быстрее. Или я должен перейти к значению одного столбца?

1 Ответ

0 голосов
/ 14 июня 2019

Ниже код удовлетворит ваше требование

Create   table #test
(id int,
person_id int,
ColumnName varchar(50),
StringValue varchar(50),
numericValue varchar(50)
)

insert into #test values (1,1,'FirstName','John',null)
insert into #test values (2,1,'Amount',null,'100')
insert into #test values (3,1,'PostalCode',null,'112334')
insert into #test values (4,1,'LastName','Smith',null)
insert into #test values (5,1,'AccountNumber',null,'123456')

--select * from  #test


Declare @Para varchar(max)='',
 @Para1 varchar(max)='',
@main varchar(max)=''

select  @Para +=  ','+QUOTENAME(ColumnName)
 from (select distinct ColumnName from #test) as P 
set @Para1= stuff(@para ,1,1,'')
print @Para1

set @main ='select * from (
select  coalesce(StringValue,numericValue) as Val,ColumnName from #test) as Main
pivot
(
min(val) for  ColumnName in ('+@Para1+')
) as pvt'

Exec(@main)
...