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

时间:2010-06-25 11:30:25

标签: sql-server ssas

我有一个内置于SSAS2008的立方体,它基于2个表 - 账户和付款。

这两个表都有维度和度量,而且看起来效果相对较好 - 我可以根据付款或帐户的维度以及分解为帐户维度的帐户指标来获得付款。

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

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

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

感谢。


更新:由于缺乏兴趣,Bounty加入......

1 个答案:

答案 0 :(得分: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的子项。

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

祝你好运。