Pregunta

Recibí datos de una fuente externa, que están en un formato resumido.Necesito una manera de desagregar esto para que encaje en un sistema que estoy usando.

Para ilustrar, supongamos que los datos que recibí se ven así:

receivedTable:

Age     Gender     Count
40      M          3
41      M          2

Quiero que este sea un formato desagregado como este:

systemTable:

ID      Age        Gender
1       40         M          
2       40         M 
3       40         M 
4       41         M          
5       41         M 

Gracias
carlos

¿Fue útil?

Solución

En función de la gama de su conteo se puede utilizar una tabla de consulta que contiene exactamente x registros para cada entero x. De esta manera:

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

A continuación, se unen a esta tabla:

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

Otros consejos

Desde "Funciona en mi máquina (TM)" estable una consulta recursiva, con todas las advertencias habituales sobre la profundidad máxima de recursividad.

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!!

No obtiene el identificador de fila, pero insertar el resultado de la consulta en una tabla con una columna de identidad solucionaría eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top