【问题标题】:Getting measures from parent table using child table dimensions使用子表维度从父表获取度量
【发布时间】:2010-06-29 23:51:50
【问题描述】:

我有一个在 SSAS2008 中构建的多维数据集,它基于 2 个表 - Accounts 和 Payments。

两个表都有维度和度量,而且它似乎运行得相对较好 - 我可以将帐户的付款分解为付款或帐户的维度,并将帐户度量分解为帐户维度。

我不能做的是查看与子付款表存在关系的帐户的度量。例如,查看至少有 1 笔付款的所有帐户的余额。

我知道我可能需要一个单独的多维数据集,但我仍然看不到需要如何配置我的数据源。

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

谢谢。


更新:由于缺乏兴趣而增加了赏金...

【问题讨论】:

    标签: sql-server ssas


    【解决方案1】:

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

    我可以推荐几个选项。首先想到的是在账户多维数据集中创建一个基于支付事实表的退化维度。以下示例回答了您的“所有有付款的帐户”问题,但这应该适用于类似的问题。我假设帐户对帐单日期为每个日历月的最后一天,因此您需要计算每个日历月的付款。

    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
    

    现在在您的帐户多维数据集中创建付款计数维度应该是一件轻而易举的事。加分,去掉视图中的group by和sum,让SSAS做聚合;它适合我显示上面的结果表。在您没有在源数据库中创建视图权限的数据源视图中使用视图的 SQL。

    选项 2 是从帐户多维数据集中的度量上方的视图中计算付款。除了使您的帐户事实使用类似于 dim_AccountPayments 的视图之外,您可以与上述解决方案类似地执行此操作。这次你必须按所有关键字段分组并聚合数据库中的度量......非常难看。我不推荐,但有可能。

    如果您选择选项 1,那么在帐户付款维度中创建一个名为“本月付款”的命名集非常简单,它是所有过滤后删除 0 的子集。

    我希望我能理解你的问题。我确实不得不对您的数据结构做出很多假设,但我希望它是有用的。

    祝你好运。

    【讨论】:

    • 是的,这很有用,但是我回到数据后才意识到,我最初想做的事情是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    相关资源
    最近更新 更多