Sql server 使用子表维度从父表获取度量值
我有一个SSAS2008内置的多维数据集,它构建在两个表上——账户和付款 这两个表都有维度和度量值,它似乎运行得比较好-我可以将帐户的付款分解为付款或帐户的维度,并将帐户度量值分解为帐户维度 我不能做的是查看与子付款表存在关系的帐户的度量。例如,查看至少有1笔付款的所有帐户的余额 我知道我可能需要一个单独的多维数据集,但我仍然看不出我的数据源需要如何配置 理想情况下,我不希望/不必将数据完全重新格式化为事实/维度雪花模式,因为我不完全确定如何使用我拥有的关系数据来实现这一点,但是欢迎对此提出任何建议 谢谢Sql server 使用子表维度从父表获取度量值,sql-server,ssas,Sql Server,Ssas,我有一个SSAS2008内置的多维数据集,它构建在两个表上——账户和付款 这两个表都有维度和度量值,它似乎运行得比较好-我可以将帐户的付款分解为付款或帐户的维度,并将帐户度量值分解为帐户维度 我不能做的是查看与子付款表存在关系的帐户的度量。例如,查看至少有1笔付款的所有帐户的余额 我知道我可能需要一个单独的多维数据集,但我仍然看不出我的数据源需要如何配置 理想情况下,我不希望/不必将数据完全重新格式化为事实/维度雪花模式,因为我不完全确定如何使用我拥有的关系数据来实现这一点,但是欢迎对此提出任何
更新:由于缺乏兴趣而添加了Bounty…我的回答考虑到您不想将数据重新格式化为传统的数据仓库模式。如果它能让你走得更远,那对你有好处,但我怀疑随着项目的发展,你会遇到更多这样的问题。在需要之前,您可能需要修改如何将数据转换为星型模式 我可以提出一些选择。首先想到的是在accounts多维数据集中创建一个基于payments事实表的退化维度。下面的示例回答了您的“所有有付款的帐户”问题,但这应该适用于类似的问题。我假设账户对账单日期是每个日历月的最后一天,所以您需要计算每个日历月的付款
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
现在在您的accounts多维数据集中创建payments count维度应该是一种冒险。对于额外点数,删除视图中的group by和sum,让SSA进行聚合;它适合我显示上面的结果表。在数据源视图中使用视图的SQL,因为您在源数据库中没有“创建视图”权限
选项2是从accounts多维数据集中的度量值上方的视图进行付款计数。除了使您的帐户使用类似于dim_AccountPayments的视图之外,您可以类似于上述解决方案执行此操作。这一次,您必须按所有键字段分组,并聚合数据库中的度量值。。。非常难看。我不推荐,但这是可能的
如果使用选项1,则在account payments维度中创建名为“Made a payment this month”的命名集非常简单,该命名集是所有筛选以删除0的子项
我希望我理解你的问题。我确实需要对您的数据结构做一些假设,但我希望它有用
祝您好运。我的回答考虑到您不想将数据重新格式化为传统的数据仓库模式。如果它能让你走得更远,那对你有好处,但我怀疑随着项目的发展,你会遇到更多这样的问题。在需要之前,您可能需要修改如何将数据转换为星型模式 我可以提出一些选择。首先想到的是在accounts多维数据集中创建一个基于payments事实表的退化维度。下面的示例回答了您的“所有有付款的帐户”问题,但这应该适用于类似的问题。我假设账户对账单日期是每个日历月的最后一天,所以您需要计算每个日历月的付款
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
现在在您的accounts多维数据集中创建payments count维度应该是一种冒险。对于额外点数,删除视图中的group by和sum,让SSA进行聚合;它适合我显示上面的结果表。在数据源视图中使用视图的SQL,因为您在源数据库中没有“创建视图”权限
选项2是从accounts多维数据集中的度量值上方的视图进行付款计数。除了使您的帐户使用类似于dim_AccountPayments的视图之外,您可以类似于上述解决方案执行此操作。这一次,您必须按所有键字段分组,并聚合数据库中的度量值。。。非常难看。我不推荐,但这是可能的
如果使用选项1,则在account payments维度中创建名为“Made a payment this month”的命名集非常简单,该命名集是所有筛选以删除0的子项
我希望我理解你的问题。我确实需要对您的数据结构做一些假设,但我希望它有用
祝你好运。是的,这很有用,但在返回数据后,我意识到我原来想做的是不可能的。是的,这很有用,但在返回数据后,我意识到我原来想做的是不可能的。