2010-04-09 4 views
2

Я получил данные из внешнего источника, который находится в сжатом формате. Мне нужен способ дезагрегировать это, чтобы вписаться в систему, которую я использую.дезагрегировать итоговую таблицу в SQL Server 2008

Для иллюстрации предположим, что данные, которые я получил выглядит следующим образом:

receivedTable: 

Age  Gender  Count 
40  M   3 
41  M   2 

Я хочу это дисагрегированный формат так:

systemTable: 

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

Благодаря
Карл

ответ

1

В зависимости от в диапазоне вашего счета вы можете использовать таблицу поиска, которая содержит ровно х записей для каждого целого x. Как это:

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 

затем присоединиться к этой таблице:

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

Прохладный, целые таблицы. Это будет работать отлично. Мой диапазон подсчета увеличивается до тысяч, поэтому, я думаю, мне понадобится сценарий для автоматического создания таблицы – Karl

2

от «работает на моей машине (TM)» стабильный рекурсивный запрос, со всеми обычными оговорками о максимальной глубине рекурсии.

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

Вы не получите идентификатор строки - но вставить результат запроса в таблицу со столбцом идентификаторов будет иметь дело с этим.