SQL Server:如何获取未知数量的字段作为列名?

时间:2019-06-07 07:37:33

标签: sql-server

我有一个通过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   |...

它可以在为此格式专门创建的另一个表中。

每个“ id”在“关键字”列中的值数量可以不同。因此有时有200个“关键字”,有时有240个“关键字”

我已经尝试过枢轴功能,但是它不起作用。我还读到这不是理想的选择。

我不知道将数据获取到表中的代码。

我读到在动态数据透视表中,需要指定成为列名称的所有字段。那我需要指定+ -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 '

每个+ -240(关键字)大约有28000个(元素)。每天添加+ -10(elementid)。

1 个答案:

答案 0 :(得分:0)

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