desagregar tabla resumida en SQL Server 2008
-
25-09-2019 - |
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
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.