表格DAX每日多对多

时间:2015-07-22 15:58:42

标签: dax tabular ssas-2012

我几乎已经处于关键问题的最后,我目前在模型中遇到的问题......基本上,我有一个'时间'的多对多映射表,它可以映射管理人员的佣金率...可以每天更换,(但很少这样做),所以我试图避免只是有一个巨大的表,具有相同的值重复,虽然不同的具体日期,如果我这样做,无论如何我最终得到一个2亿记录表,至关重要虽然不止一个经理可以获得某种产品类型的销售佣金:s

注意有些佣金仅转到单个经理,有些佣金转到多个,这可以随着时间的推移而改变..

我所做的是保持ValidFrom,并在映射表中保存ValidTo日期......

我提出的每个解决方案都非常缓慢,我只是不知道在这一点上是否有一个解决方案...这里有一个非常小的样本的链接: - http://1drv.ms/1gOr7uw

我认为最麻烦的区域实际上是在给定的日期为给定的管理员获得正确的“费率”......我能够做到这一点的唯一方法是嵌套的SUMX,但那里一定是我缺少的东西?!

我想到的一件事(但未能实际实施)只是为了保持生效日期,并使用它来过滤并利用LASTNONBLANK()或其他东西?

也许有些新鲜眼睛的人可以帮助我?把头发拉出来!

编辑:有人可能会说为什么我不在ETL中这样做,我在这里没有显示的是我有其他措施不需要被分割管理者,但应报告每个人的全部金额...但总数不是所有经理人的总和(也就是默认的M2M行为)

也许我需要两个事实表?也许有人可以在Excel中对我的数据进行建模,以实现事实的“分裂”,正如我所看到的那样,无论哪种方式切割 某些 calc都需要在运行时完成。我想?!

1 个答案:

答案 0 :(得分:2)

尝试一下,我没有检查性能,但我不希望它们超级......不过,至少它看起来很优雅:)

Amount := 
SUMX (
    SUMMARIZE (
        Mapping,
        Mapping[Manager],
        Mapping[Rate],
        Mapping[ValidFrom],
        Mapping[ValidTo],
        Products[Products],
        "SalesInPeriod", Mapping[Rate]
            * CALCULATE (
                SUM ( Sales[Amount] ),
                VALUES ( 'Date'[Date] ),
                DATESBETWEEN (
                    'Date'[Date],
                    Mapping[ValidFrom],
                    Mapping[ValidTo]
                )
            )
    ),
    [SalesInPeriod]
)

如果你想计算,仍然保持时间M2M工作,这应该做的伎俩:

Count := 
CALCULATE (
    COUNTROWS ( Sales ),
    GENERATE (
        SUMMARIZE (
            Mapping,
            Mapping[ValidFrom],
            Mapping[ValidTo],
            Products[Products]
        ),
        DATESBETWEEN (
            'Date'[Date],
             Mapping[ValidFrom],
             Mapping[ValidTo]
        )   
    ),
    VALUES ( 'Date'[Date] )
)

后一版本更容易,因为它不需要Rate和Manager(或者,它需要管理器,但它已经在过滤器上下文中,因为您使用规范M2M进行聚合所以不需要SUMX)