Sql MDX解决方案:每个组提取1条记录并添加到主结果集

Sql MDX解决方案:每个组提取1条记录并添加到主结果集,sql,ssas,mdx,resultset,dimension,Sql,Ssas,Mdx,Resultset,Dimension,我有一个非常简单的事实/维度模式,用于SSAS 2008 R2数据库中的房地产数据 我想构建一个结果集,概述房子第一次售出的时间、售价以及以每月递增的方式售出后的房屋价值 请考虑以下尺寸和措施: 尺寸: 戴姆豪斯数 门牌号 估价日期 估价日期 二硬脂酸盐 索达特 措施: 索尔达蒙特 当前值 伯爵府 [DimHouseNumber][HouseNumber]属性层次结构表示门牌号 [DimSoldDate].[SoldDate]属性层次结构表示房屋出售的日期。 [DimValuationDate]

我有一个非常简单的事实/维度模式,用于SSAS 2008 R2数据库中的房地产数据

我想构建一个结果集,概述房子第一次售出的时间、售价以及以每月递增的方式售出后的房屋价值

请考虑以下尺寸和措施:

尺寸: 戴姆豪斯数 门牌号

估价日期 估价日期

二硬脂酸盐 索达特

措施: 索尔达蒙特 当前值 伯爵府

[DimHouseNumber][HouseNumber]属性层次结构表示门牌号 [DimSoldDate].[SoldDate]属性层次结构表示房屋出售的日期。 [DimValuationDate].ValuationDate属性层次结构表示房屋出售后的估价日期。 [SoldAmount]指标代表了房屋原价。 [CurrentValue]度量值表示基于[DimValuationDate].ValuationDate属性层次结构成员出售的房屋的当前价值。

这样,考虑下面的结果集,包含所有可能的元组和度量,基于上面概述的维度和度量:

门牌号|出售日期|出售金额|估价日期|现值 您可以在上面看到,每个月的销售日期和销售金额值都保持不变。根据基础事实表的配置方式对所涉及的房屋编号进行估价

插入到相应事实表中的记录表示房屋出售后的每月估价

话虽如此,我想将上面的结果集转换为如下所示:

门牌号|估价日期|现值 你可以在上面看到,我正在尝试创建一个按时间顺序排列的时间表,包括房子出售时的估价

基本上,对于每一所售出的房子,我想要一份记录,概述房子的价值和估价日期

您可以看到,上面两个结果集的区别在于,上面的第二个结果集包括房屋出售日期以及作为估价期一部分的售价。上面的第一个结果集只包括房子出售后的日期

我需要根据上述第一个结果集中包含的数据生成上述第二个结果集

不幸的是,我没有机会修改OLTP端或SSAS多维数据集本身的源数据,因此我需要一个仅用于MDX的解决方案

如果有人能根据我上面概述的维度和度量向我展示完成此任务所需的MDX声明,我将不胜感激


非常感谢你的帮助

假设您在[DimValuationDate]中拥有所有可用的天数,您可以尝试以下计算度量:

with 
    member [Measures].[Value] as 
           iif( not isEmpty( ( [Measures].[Current Value], [DimValuationDate].currentMember )),
                ( [Measures].[Current Value], [DimValuationDate].currentMember ),
                iif( not isEmpty( ([Measures].[Sold Amount], LinkMember( [DimValuationDate].currentMember, [DimSoldDate] ))),
                     ([Measures].[Sold Amount], LinkMember( [DimValuationDate].currentMember, [DimSoldDate] )),
                     null
                )
            )

select 
    [Measures].[Value] on 0,
    non empty [DimHouseNumber].members * [DimValuationDate].members on 1

from 
    [my-cube]

这似乎是一个简单的联合查询:

select *
from ((select distinct HouseNumber, SoldDate as ValuationDate, CurrentValue
       from fact
      ) union all
      (select HouseNumber, ValuationDate, CurrentValue
       from fact
      )
     ) f
order by HouseNumber, ValuationDate

此查询将销售数据与估价数据结合起来。

也许您可以发布应用程序的完整规格。这里没什么要说的。谢谢马克的快速回复。我试过你的解决办法。如上所述,我的要求是轴上的[valuationDate]维度同时反映SoldDate或valuationDate。本质上,如果我们引用我在上面发布的第一个结果集,我们将为每个HounseNumber添加一条额外的记录,反映SoldAmount和SoldDate,您的解决方案只引用轴上的[DimValuationDate]维度,而不是[SoldDate]。有什么想法吗?谢谢你的帮助!是否可能以某种方式提取与每个门牌号相关的第一条记录,引用SoldDate和SoldAmount,然后将其添加回主结果集?我在想,也许一个集合可以拉出每个门牌号的第一个记录,并且可以以某种方式交叉连接回主结果集合,有效地添加最初计划的附加记录?不理解;你的[DimValuationDate]有所有的日子吗?”因为在我提议的计算成员[Value]中,我正在执行[DimSoldDate]中的LinkMember。。。因此[DimValuationDate]。轴上的成员将是Valuation或Seld date。如果假设是错误的,那么你是否有一个时间维度将一直存在?谢谢戈登的回答。我无法通过T-SQL修改基础数据源中的基础事实数据,因此我只能对现有多维数据集结构使用MDX,不允许修改我引用的SSAS OLAP多维数据集。如果我能想出如何将您上面发布的T-SQL转换为与MDX等价的查询,那就太好了。我认为MDX支持union。但是,我确实首先看到了SQL标记,并用SQL进行了响应。
with 
    member [Measures].[Value] as 
           iif( not isEmpty( ( [Measures].[Current Value], [DimValuationDate].currentMember )),
                ( [Measures].[Current Value], [DimValuationDate].currentMember ),
                iif( not isEmpty( ([Measures].[Sold Amount], LinkMember( [DimValuationDate].currentMember, [DimSoldDate] ))),
                     ([Measures].[Sold Amount], LinkMember( [DimValuationDate].currentMember, [DimSoldDate] )),
                     null
                )
            )

select 
    [Measures].[Value] on 0,
    non empty [DimHouseNumber].members * [DimValuationDate].members on 1

from 
    [my-cube]
select *
from ((select distinct HouseNumber, SoldDate as ValuationDate, CurrentValue
       from fact
      ) union all
      (select HouseNumber, ValuationDate, CurrentValue
       from fact
      )
     ) f
order by HouseNumber, ValuationDate