Hello,
this is simple and 'dirty' solution for your problem using stored procedure instead of insert into denormalized table ... maybe it will help
best regards
Chris
create table t (
id varchar(10),
a int
)
go
insert into t values('A',1)
insert into t values('A',2)
insert into t values('A',3)
insert into t values('B',1)
insert into t values('B',2)
insert into t values('C',1)
insert into t values('C',3)
insert into t values('D',1)
select
max(t2.num)
from
(select distinct id, count(a) num from t group by id) t2
-- lets create destination table
create table tdist (
id varchar(10),
int_c int default(0), -- this is internal counter of last inserted value
a1 int,
a2 int,
a3 int,
a4 int,
a5 int,
a6 int,
a7 int,
a8 int,
a9 int,
a10 int,
a11 int,
a12 int,
a13 int,
a14 int,
a15 int
)
-- now let's create proc for inserting one row of data
create procedure sp_insert_denorm
@myid varchar(10),
@mya int
as
begin
declare @p1 int
declare @sql varchar(255)
if exists (select id from tdist where id=@myid)
begin
select @p1=int_c from tdist where id=@myid
set @sql = 'update tdist set a' + CONVERT(varchar(5), @p1) + '=' + CONVERT(varchar(5), @mya) + ' where id=''' + CONVERT(varchar(5), @myid) + ''''
exec (@sql)
update tdist set int_c = @p1 + 1
end
else
insert into tdist (id,int_c, a1) values (@myid,2,@mya)
end
go
exec sp_insert_denorm 'A',1
exec sp_insert_denorm 'A',2
exec sp_insert_denorm 'A',3
exec sp_insert_denorm 'B',1
exec sp_insert_denorm 'B',2
exec sp_insert_denorm 'C',1
exec sp_insert_denorm 'C',3
exec sp_insert_denorm 'D',1
go
2> select id,a1,a2,a3,a4 from tdist
3> go
id a1 a2 a3 a4
---------- ----------- ----------- ----------- -----------
A 1 2 3 NULL
B 1 2 NULL NULL
C 1 3 NULL NULL
D 1 NULL NULL NULL
(4 rows affected)