我的回答考虑到您不想将数据重新格式化为传统的数据仓库架构。如果它能让你走得更远,那对你有好处,但我怀疑随着项目的发展,你会遇到更多这些问题。在需要之前如何将数据转换为星型模式可能值得修改。
我可以推荐几个选项。首先想到的是在账户多维数据集中创建一个基于支付事实表的退化维度。以下示例回答了您的“所有有付款的帐户”问题,但这应该适用于类似的问题。我假设帐户对帐单日期为每个日历月的最后一天,因此您需要计算每个日历月的付款。
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 的子集。
我希望我能理解你的问题。我确实不得不对您的数据结构做出很多假设,但我希望它是有用的。
祝你好运。