SQL Server: как получить неизвестное количество полей в качестве имени столбца? - PullRequest
0 голосов
/ 07 июня 2019

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

Я получаю данные в следующем макете:

elementtype | elementid | groupkeyword | keyword | name   | type     | value | options

event       | 2644-1523 | algemeneinfo | artiest  | art   |  text    | test1 | NULL
event       | 2644-1523 | algemeneinfo | titel    | tit   |  text    | test2 | "OK"
event       | 2644-1523 | algemeneinfo | startuur | start | datetime | 20:00 | NULL
event       | 2644-1523 | algemeneinfo | einduur  | eind  | datetime | 22:00 | NULL
...         |...        |...           |...       |..     |...       |...    |...

Я бы хотел, чтобы таблица имела такой макет:

elementid | artiest | titel | startuur | einduur |...

2644-1523 | test1   | test2 | 20:00    | 22:00   |...

Может быть в другой таблице, созданной специально для этого формата.

Количество значений в столбце «ключевое слово» может отличаться для каждого «идентификатора».Так что иногда есть 200 «ключевых слов», а иногда 240 «ключевых слов»

Я пробовал функцию pivot, но она не работает.Я также читал, что это не идеальный способ.

Я не знаю код, который получает данные в таблицу.

Я прочитал это в динамической сводной таблице, все поляимена столбцов должны быть указаны.Так что мне нужно указать + -240 имен столбцов?

Запрос, который я использую, чтобы получить все данные:

SELECT [elementtype]
      ,[elementid]
      ,[groupkeyword]
      ,[keyword]
      ,[name]
      ,[type]
      ,[value]
      ,[options]
  FROM [dbo].[CustomdataElement]

Как лучше всего это сделать?

Я удалил запрос, который уже пробовал, потому что он не работает, я основал его на следующем коде:

create table temp
(
    date datetime,
    category varchar(3),
    amount money
)

insert into temp values ('1/1/2012', 'ABC', 1000.00)
insert into temp values ('2/1/2012', 'DEF', 500.00)
insert into temp values ('2/1/2012', 'GHI', 800.00)
insert into temp values ('2/10/2012', 'DEF', 700.00)
insert into temp values ('3/1/2012', 'ABC', 1100.00)


DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category) 
            FROM temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT date, ' + @cols + ' from 
            (
                select date
                    , amount
                    , category
                from temp
           ) x
            pivot 
            (
                 max(amount)
                for category in (' + @cols + ')
            ) p '

существует около 28000 различных (elementid) с каждым + -240 (ключевые слова).добавляются + -10 (elementid) каждый день.

1 Ответ

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

Dynamic Pivot может сделать это лучше.Как предложено Белкой.Но любые предложения или улучшения будут оценены.Попробуйте это:

create table #temp
(
    element_id datetime,
    element_info varchar(25), //Max value can be according to your need.
    value varchar(50) //Max value can be according to your need.
)

insert into #temp values (2644414721-1559139530, 'algementinfo_aantalgebruikarslokaal','test1')
insert into #temp values (2644414721-1559139530, 'algementinfo_aantalgebruikarslokaal','test2')

insert into #temp values (2644414721-1559139530, 'algementinfo_aantalgebruikarslokaal','test3')

insert into #temp values (2644414721-1559139530, 'algementinfo_aantalgebruikarslokaal','test4')

insert into #temp values (2644414721-1559139530, 'algementinfo_aantalgebruikarslokaal','test5')

insert into #temp values (2644414721-1559139530, 'algementinfo_aantalgebruikarslokaal','test6')

//Change all remaining element_id & info as i've done first one for you!

DECLARE @cols  AS NVARCHAR(MAX)='';
DECLARE @query AS NVARCHAR(MAX)='';

SELECT @cols = @cols + QUOTENAME(elemnent_info) + ',' FROM (select distinct element_info from #temp ) as tmp
select @cols = substring(@cols, 0, len(@cols)) --trim "," at end

set @query = 
'SELECT * from 
(
    select element_id,element_info, value from #temp
) src
pivot 
(   //Here aggregate function can be used to of your choice. I'm using Max
    max(amount) for category in (' + @cols + ')
) piv'

execute(@query)
drop table #temporary
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...