Sql server 使用子表维度从父表获取度量值

Sql server 使用子表维度从父表获取度量值,sql-server,ssas,Sql Server,Ssas,我有一个SSAS2008内置的多维数据集,它构建在两个表上——账户和付款 这两个表都有维度和度量值,它似乎运行得比较好-我可以将帐户的付款分解为付款或帐户的维度,并将帐户度量值分解为帐户维度 我不能做的是查看与子付款表存在关系的帐户的度量。例如,查看至少有1笔付款的所有帐户的余额 我知道我可能需要一个单独的多维数据集,但我仍然看不出我的数据源需要如何配置 理想情况下,我不希望/不必将数据完全重新格式化为事实/维度雪花模式,因为我不完全确定如何使用我拥有的关系数据来实现这一点,但是欢迎对此提出任何

我有一个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的子项

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


祝你好运。

是的,这很有用,但在返回数据后,我意识到我原来想做的是不可能的。是的,这很有用,但在返回数据后,我意识到我原来想做的是不可能的。