2010-04-09 12 views
2

J'ai reçu des données d'une source externe, qui est dans un format résumé. J'ai besoin d'un moyen de désagréger cela pour l'adapter à un système que j'utilise.Résumé tableau désagrégé dans SQL Server 2008

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

Répondre

1

Selon des la plage de votre compte vous pouvez utiliser une table de recherche qui contient exactement x enregistrements pour chaque entier x. 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 joignent à cette table:

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 
+0

Cool, tableau des entiers. Cela fonctionnerait parfaitement. Ma gamme de comptage monte dans les milliers, donc je suppose que je vais avoir besoin d'un script pour générer la table automatiquement – Karl

2

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.