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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top