Как динамически преобразовывать строки в столбцы в SQL Server - PullRequest
0 голосов
/ 26 июня 2019

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

create table testtable
(
    tableid int primary key identity(1,1),
    tableDatetime datetime,
    names varchar(50),
    tablevalue decimal(18,9)
)
go

insert into testtable
select '2019-06-13 13:56:39.117', 'test1',23.45 union all
select '2019-06-13 13:56:39.117', 'test2',33.45 union all
select '2019-06-13 13:56:39.117', 'test3',10.45 union all
select '2019-06-13 13:56:39.117', 'test4',90.45 union all
select '2019-06-13 14:01:41.280', 'test1',33.45 union all
select '2019-06-13 14:01:41.280', 'test2',53.45 union all
select '2019-06-13 14:01:41.280', 'test3',41.45 union all
select '2019-06-13 14:01:41.280', 'test4',93.45 union all
select '2019-06-13 14:06:42.363', 'test1',30.45 union all
select '2019-06-13 14:06:42.363', 'test2',13.45 union all
select '2019-06-13 14:06:42.363', 'test3',23.45 union all
select '2019-06-13 14:06:42.363', 'test4',73.45  

go
select * from testtable

Я хочу преобразовать данные в прикрепленный формат изображения

rows to columns output

Спасибо

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

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

    GO
    declare @query varchar(max)
    set @query = (select stuff( (select distinct ',' +  names from testtable for xml path ('')) ,1,1,'') as d)

    declare @resquery nvarchar(max)
    set @resquery = '
    select * from (
    select tableDatetime , names , tablevalue  from testtable
    ) as d
    pivot ( max(tablevalue) for names in ( ' + @query + ' ) ) as pv'
    exec sp_executesql @resquery

    GO

Пожалуйста, используйте это согласно вашей структуре таблицы, это создаст динамические имена столбцов для ваших текущих данных таблицы. Что в дальнейшем используется в pivot для преобразования ваших строк в столбцы.

Отметьте его как принятый или оставьте комментарий для дальнейшего запроса.

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

С условной агрегацией для данных пробы, которые вы разместили:

select
  tableDatetime,
  max(case when names = 'test1' then tablevalue end) test1,
  max(case when names = 'test2' then tablevalue end) test2,
  max(case when names = 'test3' then tablevalue end) test3,
  max(case when names = 'test4' then tablevalue end) test4
from testtable
group by tableDatetime

См. Демоверсию .
Результаты:

> tableDatetime       | test1        | test2        | test3        | test4       
> :------------------ | :----------- | :----------- | :----------- | :-----------
> 13/06/2019 13:56:39 | 23.450000000 | 33.450000000 | 10.450000000 | 90.450000000
> 13/06/2019 14:01:41 | 33.450000000 | 53.450000000 | 41.450000000 | 93.450000000
> 13/06/2019 14:06:42 | 30.450000000 | 13.450000000 | 23.450000000 | 73.450000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...