Disaggre a tabela resumida no SQL Server 2008
-
25-09-2019 - |
Pergunta
Recebi dados de uma fonte externa, que está em um formato resumido. Preciso de uma maneira de desagregar isso para se encaixar em um sistema que estou usando.
Para ilustrar, suponha que os dados que recebi se parecem:
receivedTable:
Age Gender Count
40 M 3
41 M 2
Eu quero que este seja um formato desagregado como este:
systemTable:
ID Age Gender
1 40 M
2 40 M
3 40 M
4 41 M
5 41 M
Obrigado
Karl
Solução
Dependendo do intervalo da sua contagem, você pode usar uma tabela de pesquisa que contém exatamente X registros para cada número inteiro x. Assim:
create table counter(num int)
insert into counter select 1
insert into counter select 2
insert into counter select 2
insert into counter select 3
insert into counter select 3
insert into counter select 3
insert into counter select 4
insert into counter select 4
insert into counter select 4
insert into counter select 4
Em seguida, junte -se a esta tabela:
create table source(age int, gender char(1), num int)
insert into source select 40, 'm', 3
insert into source select 30, 'f', 2
insert into source select 20, 'm', 1
--insert into destination(age, gender)
select age, gender
from source
inner join counter on counter.num = source.num
Outras dicas
A partir do estábulo "Trabalhos na minha máquina (TM)" uma consulta recursiva, com todas as advertências usuais sobre a profundidade máxima de recursão.
with Expanded(exAge, exGender, exRowIndex) as
(
select
Age as exAge,
Gender as exGender,
1 as exRowIndex
from
tblTest1
union all
select
exAge,
exGender,
exRowIndex+1
from
tblTest1 t1
inner join
Expanded e on (e.exAge = t1.Age and e.exGender = t1.Gender and e.exRowIndex < t1.Count)
)
select
exAge,
exGender,
exRowIndex
from
Expanded
order by
exAge,
exGender,
exRowIndex
option (MAXRECURSION 0) -- BE CAREFUL!!
Você não recebe o identificador da linha - mas inserir o resultado da consulta em uma tabela com uma coluna de identidade lidaria com isso.