我的回答考虑到,你不希望你的数据重新格式化为传统的数据仓库架构的帐户。如果进一步让你在路上那么对你来说不错,但我怀疑你会碰到更多这样的问题为您拓展项目。在您需要之前,如何将数据转换为星型模式可能是值得修补的。
我可以建议几个选项。首先想到的是在基于付款事实表的帐户立方体中制作退化维。以下示例回答您的“所有有付款的帐户”问题,但这应该适用于类似的问题。我假设帐户结算日期是每个日历月的最后一天,因此您需要计算每个日历月的付款。
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
现在应该不费吹灰之力做出付款算在你的帐户多维数据集维度。要获得额外的积分,请在视图中移除该组并按总和进行聚合;它适合我显示上面的结果表。在您的数据源视图中使用视图的SQL,您在源数据库中没有创建视图权限。
选项2将从帐户多维数据集中的度量上方的视图进行支付计数。除了使帐户事实上使用类似于dim_AccountPayments的视图外,您可以类似于上述解决方案来执行此操作。这一次,您必须按所有关键字段进行分组,并汇总数据库中的度量值......非常难看。我不推荐它,但它是可能的。
如果使用选项1,那么这是很简单的做一个名为叫帐户付款尺寸设置“造这个月支付”,这是所有的子女过滤,以除去0
我希望我的理解去你的问题。我不得不对你的数据结构做很多假设,但我希望它很有用。
祝你好运。
是的,这很有用,但是我回到数据后意识到我原本想做的事情是不可能的。 – cjk 2010-07-05 07:34:09