在SQL Server 2008中分解汇总表

时间:2010-04-09 09:42:02

标签: sql sql-server-2008 summarization

我收到了来自外部来源的数据,这是一种汇总格式。我需要一种方法来分解这个以适应我正在使用的系统。

为了说明,假设我收到的数据如下所示:

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 

感谢
卡尔

2 个答案:

答案 0 :(得分: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!!

您没有获得行标识符 - 但是将查询结果插入到具有标识列的表中将会处理该标识符。

答案 1 :(得分:1)

根据您的计数范围,您可以使用一个查找表,其中包含每个整数x的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