désagréger tableau résumé dans SQL Server 2008
-
25-09-2019 - |
Question
J'ai reçu des données à partir d'une source externe, qui est dans un format résumé. Je besoin d'un moyen de désagréger ce pour entrer dans un système que je me sers.
Pour illustrer, supposons que les données que je reçus ressemble à ceci:
receivedTable:
Age Gender Count
40 M 3
41 M 2
Je veux que c'est un format désagrégé comme ceci:
systemTable:
ID Age Gender
1 40 M
2 40 M
3 40 M
4 41 M
5 41 M
Merci
Karl
La solution
En fonction de la portée de votre compteur, vous pouvez utiliser une table de consultation qui contient exactement x enregistrements pour chaque x entier. Comme ceci:
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
puis se joindre à ce tableau:
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
Autres conseils
De la « Travaux sur ma machine (TM) » stable une requête récursive, avec toutes les mises en garde habituelles sur la profondeur de récursivité maximale.
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!!
Vous ne recevez pas l'identifiant de ligne - mais l'insertion du résultat de la requête dans une table avec une colonne d'identité réagiriez que
.