将日期添加到 DAX sumx/switch/filter 查询

问题描述 投票:0回答:1

我继承了 Power BI 报告中现有的 DAX 语句,该语句根据来源和产品计算费用;

Fee= SUMX(
    FILTER(
        'Accounts',
        AND(
            RELATED('Processes'[processtype_group]) = "NEWBUS",
            RELATED('Transaction classes'[transaction_class_code]) = "Undwrite")
    ),
    SWITCH(
        RELATED(Source[source name]) & " " & RELATED(Products[Product name]),
        "Source1 Product1", -25,
        "Source1 Product2", -25,
        "Source1 Product3", -50,
        "Source1 Product4", -25,
        "Source2 Product1", -41.60,
        "Source2 Product2", -41.60,
        "Source2 Product3", -53.60,
        "Source2 Product4", -35.60)
        )

我想添加供应商更改费用的日期范围。

来自多个表的数据使情况变得更加复杂,但是我如何添加日期范围,以便根据产品的销售时间显示正确的费用?

我已经尝试过这个

Fee2 = sumx(
    FILTER(
        'Accounts',
        AND(
            RELATED('Processes'[processtype_group]) = "NEWBUS",
            RELATED('Transaction classes'[transaction_class_code]) = "Undwrite")
    ),
    SWITCH(
        true(),
        RELATED(Source[source name]) & " " & RELATED(Products[Product name]),
        "Source1 Product1", -25,
        "Source1 Product2", -25,
        "Source1 Product3", -50,
        "Source1 Product4", -25,
        "Source2 Product1" && Accounts[posted_date] < DATE(2024,03,01), -41.60,
        "Source2 Product2" && Accounts[posted_date] < DATE(2024,03,01), -41.60,
        "Source2 Product3" && Accounts[posted_date] < DATE(2024,03,01), -53.60,
        "Source2 Product4" && Accounts[posted_date] < DATE(2024,03,01), -35.60,
        "Source2 Product1" && Accounts[posted_date] >= DATE(2024,03,01), -43.00,
        "Source2 Product2" && Accounts[posted_date] >= DATE(2024,03,01), -43.00,
        "Source2 Product3" && Accounts[posted_date] >= DATE(2024,03,01), -55.00,
        "Source2 Product4" && Accounts[posted_date] >= DATE(2024,03,01), -36.85)
        )

但是我收到一条错误消息“函数‘SWITCH’不支持将 Text 类型的值与 True/False 类型的值进行比较”

powerbi switch-statement dax
1个回答
0
投票

这对您来说是可行的解决方案吗?我用一些示例数据重新创建了您的问题。

Fee = 
VAR _Table = FILTER(
        'Accounts Table',
        RELATED('Processes Table'[processtype_group]) = "NEWBUS" &&
        RELATED('Transaction Classes'[transaction_class_code]) = "Undwrite"
)
RETURN SUMX(
    _Table,
    VAR Concat = RELATED('Source table'[source_name]) & " " & RELATED(Products[product_name])
    VAR DateApplicable = 'Accounts Table'[posted_date]
    RETURN 
        SWITCH(
            TRUE(),
            (Concat = "Source1 Product1"), -25,
            (Concat = "Source1 Product2"), -25,
            (Concat = "Source1 Product3"), -50,
            (Concat = "Source1 Product4"), -25,
            (Concat = "Source2 Product1") && (DateApplicable < DATE(2024,03,01)), -41.60,
            (Concat = "Source2 Product2") && (DateApplicable < DATE(2024,03,01)), -41.60,
            (Concat = "Source2 Product3") && (DateApplicable < DATE(2024,03,01)), -53.60,
            (Concat = "Source2 Product4") && (DateApplicable < DATE(2024,03,01)), -35.60,
            (Concat = "Source2 Product1") && (DateApplicable >= DATE(2024,03,01)), -43.00,
            (Concat = "Source2 Product2") && (DateApplicable >= DATE(2024,03,01)), -43.00,
            (Concat = "Source2 Product3") && (DateApplicable >= DATE(2024,03,01)), -55.00,
            (Concat = "Source2 Product4") && (DateApplicable >= DATE(2024,03,01)), -36.85
        )
)
  • 此措施中的开关检查一个或两个条件是否为真,预先使用变量以确保您不必在其他地方重复代码。

最终结果

结果表

您最初的解决方案不起作用,因为您插入了 'RELATED(Source[source name]) & " " & RELATED(Products[Product name])' 作为 switch 内的第二个参数,这就是您的第一个 'case'。它基本上会检查是否 TRUE() = Source1 Product1",这是没有意义的,Power BI 正确解决了这个问题。

我必须提到这个解决方案并不健壮并且非常冗长。也许您可以使用另一个查找表,在其中定义不同的条件,并且您可以查找每个特定的组合(在本例中为串联和日期)应应用哪些费用?这更易于维护并且需要编写的代码更少。

© www.soinside.com 2019 - 2024. All rights reserved.