我有一个通过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)。
答案 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