在SSAS中基于一维和2关系创建计算量度

时间:2019-12-17 12:16:17

标签: ssas mdx cube measure multidimensional-cube

请考虑以下事实表:

Sender           Receiver         Amount
----------------------------------------
Reseller1        Resseler2        100 
Reseller1        Resseler3        200
Reseller3        Resseler1        150
Reseller3        Resseler2        50
Reseller1        Resseler4        100
Reseller4        Resseler2        350
Reseller4        Resseler1        500
Reseller4        Resseler3        250

我要基于以下公式创建计算量度:Sum(Receiver)-Sum(Sender)并创建以下结果:

Reseller             Amount
---------------------------
Reseller1             250    <---- (500 + 150) - (100 + 200 + 100)
Reseller2             500    <---- (100 + 50 + 350) - (0)
Reseller3             250    <---- (200 + 250) - (150 + 50)
Reseller4             -1000  <---- (100) - (350 + 500 + 250)

如何为此创建计算量度?

谢谢


我的DimReseller是:

ResellerCode            ResellerName
---------------------------------------
1                        Reseller1
2                        Reseller2
3                        Reseller3
4                        Reseller4

,它与SenderReceiver有两种关系


编辑1)

基于@Saeid Yousefi大师的回答:

我的结构是:

enter image description here

enter image description here

我写了这个MDX查询:

WITH 
MEMBER SenderAmount AS
    [Measures].[Amount], FORMAT_STRING = "Standard"

MEMBER ReceiverAmount AS
     (LinkMember   
     ([Sender].[Hierarchy].CurrentMember, [Receiver].[Hierarchy])  
     ,[Measures].[Amount]), FORMAT_STRING = "Standard"

MEMBER DiffAmount AS
  ReceiverAmount - SenderAmount, FORMAT_STRING = "Standard"

SELECT    {SenderAmount, ReceiverAmount, DiffAmount} ON 0,
[Sender].[Hierarchy].MEMBERS ON 1
FROM [Reseller Sales]

但是我得到null作为收款人金额:

enter image description here

我知道有一个小问题,但我无法解决!

2 个答案:

答案 0 :(得分:2)

完成任务的示例方法:

  1. 在DSV中-用string wheretosave ="" DB exBox = create "Get Path" DBE stringInn = field(exBox, "ADD Path where to save:", "", 80) void doGet(DB exBox) { wheretosave = get stringInn print wheretosave "\n" system("cmd.exe /C cd /d wheretosave & dir & PAUSE") } // doGet apply(exBox, "Get", doGet) show exBox Sender - Amount列创建两个表(作为SQL命名查询)。因此,您可以有效地分割卖方和接收者数据。
  2. 在多维数据集上-创建两个度量值组,在“金额”列上创建“汇总和”,并链接到DimReseller昏暗状态。
  3. 将Calc度量创建为Receiver - Amount

答案 1 :(得分:1)

有时在数据仓库中,维度以多种方式连接到事实表,可以使用Dim和Fact之间的直接或间接链接来创建这些方式,因此我们可以使用维度来分析不同角色中的Fact值;这些维度称为角色扮演维度。 设计多维数据集时,对于维度的每个角色,都会将新的维度实例添加到多维数据集。 在这些情况下,每个维度都将分析多维数据集,尽管您可以在报表中使用多个维度,但是在成员级别可以区分这些维度。如此说来,有时我们觉得有必要在这种情况下选择一个成员来代表维度的所有角色,这是当Link Member函数跳转以帮助我们时。

此函数有两个参数:

  • 成员表达式:返回成员的MDX表达式。
  • 层次结构表达式:返回层次结构的MDX表达式。

此函数返回与指定层次结构中的指定成员等效的成员。

因此,您的代码应类似于以下内容:

WITH 
MEMBER SenderAmount AS
    [Measures].[Amount], FORMAT_STRING = "Standard"

MEMBER ReceiverAmount AS
      (LinkMember   
         ([Sender].[Hierarchy].CurrentMember, [Receiver].[Hierarchy])  
         ,[Measures].[Amount]
         ,[Sender].[Hierarchy].[All]), FORMAT_STRING = "Standard"

MEMBER DiffAmount AS
      ReceiverAmount - SenderAmount, FORMAT_STRING = "Standard"

SELECT    {SenderAmount, ReceiverAmount, DiffAmount} ON 0,
NON EMPTY [Sender].[Hierarchy].MEMBERS ON 1
FROM [Cube]

请注意在角色扮演方面起作用的LinkMember函数。因此,[Sender]和[Receiver]是连接到多维数据集的维度的名称,您可以在多维数据集的Dimension Usage选项卡中找到这些维度的名称。另外,[Hierarchy]是属性或标准层次结构的名称,因此根据维度配置的屏幕快照,它应该是[Dimension Name] + [Hierarchy]。[Reseller Code] .members或[Reseller Code]。成员或[Hierarchy] .members取决于您想要的内容。