代码之家  ›  专栏  ›  技术社区  ›  cjk

使用子表维度从父表获取度量值

  •  1
  • cjk  · 技术社区  · 16 年前

    我在SSAS2008中有一个立方体,它建立在两个表上——账户和支付。

    这两个表都有维度和度量值,它似乎运行得比较好—我可以将帐户的付款分解为付款或帐户的维度,并将帐户度量值分解为帐户维度。

    理想情况下,我不希望/不必将数据完全重新格式化为事实/维度雪花模式,因为我不完全确定如何使用我拥有的关系数据,但是欢迎对此提出任何建议。


    更新:由于缺乏兴趣,赏金增加。。。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Sir Wobin    16 年前

    我的回答考虑到您不想将数据重新格式化为传统的数据仓库模式。如果它能让你走得更远,那对你来说是好事,但我怀疑随着你项目的发展,你会遇到更多这样的问题。在您需要数据之前,如何将其转换为星型模式,这可能是值得修补的。

    create table accounts_fact
    (   account_id int not null,
        statement_date datetime not null,
        bal int not null,
        constraint acc_pk primary key (account_id, statement_date)
    )
    
    create table payments_fact
    (   account_id int not null,
        payment_date datetime not null,
        amount money not null
    )
    
    insert into accounts_fact values (1, '20100131', 100)
    insert into accounts_fact values (1, '20100228', 120)
    insert into accounts_fact values (1, '20100331', 0)
    insert into accounts_fact values (2, '20100131', 100)
    insert into accounts_fact values (2, '20100228', 20)
    insert into accounts_fact values (2, '20100331', 50)
    insert into accounts_fact values (3, '20100131', 10)
    insert into accounts_fact values (3, '20100228', 30)
    insert into accounts_fact values (3, '20100331', 50)
    
    insert into payments_fact values (1, '20100112', 50)
    insert into payments_fact values (1, '20100118', 60)
    insert into payments_fact values (1, '20100215', 70)
    insert into payments_fact values (1, '20100318', 80)
    insert into payments_fact values (1, '20100331', 90)
    
    insert into payments_fact values (2, '20100112', 50)
    insert into payments_fact values (2, '20100215', 60)
    insert into payments_fact values (2, '20100320', 70)
    
    insert into payments_fact values (3, '20100101', 50)
    insert into payments_fact values (3, '20100118', 60)
    insert into payments_fact values (3, '20100318', 70)
    
    create view dim_AccountPayments
    as
    select  acc.account_id, acc.statement_date,
            sum(case when pay.payment_date IS NULL THEN 0
                 else 1
            end) as payment_count
    from    accounts_fact acc
      left outer join payments_fact pay on acc.account_id = pay.account_id
                         and pay.payment_date >= dateadd(mm, -1, dateadd(dd, 1, acc.statement_date))
                         and pay.payment_date <= acc.statement_date
    group by acc.account_id, acc.statement_date
    
    select * from dim_AccountPayments
    

    account_id  statement_date  payment_count
    1   2010-01-31 00:00:00.000 2
    1   2010-02-28 00:00:00.000 1
    1   2010-03-31 00:00:00.000 2
    2   2010-01-31 00:00:00.000 1
    2   2010-02-28 00:00:00.000 1
    2   2010-03-31 00:00:00.000 1
    3   2010-01-31 00:00:00.000 2
    3   2010-02-28 00:00:00.000 0
    3   2010-03-31 00:00:00.000 1
    

    现在,在accounts多维数据集中创建payments count维度应该是一个棘手的问题。对于额外的点,删除视图中的groupby和sum,让ssa进行聚合;上面的结果表适合我。在数据源视图中使用视图的SQL在源数据库中没有创建视图权限。

    如果您使用选项1,那么在account payments维度中创建一个名为“Made a payment this month”的命名集就足够简单了,它是所有被筛选以删除0的子级。

    我希望我理解你的问题。我确实需要对你的数据结构做一些假设,但我希望这是有用的。

    祝你好运。