转换Case语句,从t-SQL查询过滤到DAX

时间:2020-04-19 09:05:57

标签: powerbi dax powerquery

我在将以下t-sql查询转换为DAX时遇到问题。

概述-有两个示例表-具有以下架构的Table1和Table2

表1(ID varchar(20),Name varchar(30))

表2(CapID varchar(20),CAPName varchar(30),CapID_Final varchar(20))

请注意:上述各表之间存在一对多的关系:表2中的[ID]与表1中的[CapID]

我正在尝试根据下面的t-SQL查询根据条件导出table2中的CapID_Final列,该列工作得很好-

SELECT CASE
       WHEN [CapID] like 'CA%' and [CAPName]='x12345-Sample' 
       and [CapID] not in(select [ID] from Table1 where Name='x12345-Sample')
       THEN 'Undefined_Cap_1'

       WHEN [CapID] like 'CA%' and [CAPName]='z12345-Sample' 
       and [CapID] not in(select [ID] from Table1 where Name='z12345-Sample')
       THEN 'Undefined_Cap_2'

       WHEN [CapID] like 'CA%' and [CAPName]='a123-Sample' 
       and [CapID] not in(select [ID] from Table1 where Name='a123-Sample')
       THEN 'Undefined'

       ELSE [CapID]

   END AS [CapID_Final] from Table2

但是,我希望在使用DAX的计算列中对Power BI中的CapID_Final列进行相同的推导。

到目前为止,我已经尝试了以下代码-但即使匹配的条件,它也会返回“未定义”-

CapID_Final = 
IF(LEFT(Table2[CapID],2)="CA" && Table2[CAPName]="z12345-Sample" && 
NOT 
(COUNTROWS (
    FILTER (
        Table1,CONTAINS(Table1,Table1[ID],Table2[CapID])
    )
) > 0),"Undefined_Cap_1","Undefined"
)

我对DAX不熟悉,但是我尝试了一下,但无法弄清楚。 您能否让我知道如何将SQL查询转换为Power BI中的等效DAX?

2 个答案:

答案 0 :(得分:1)

SWITCH基本上等同于此处的CASE子句:

CapID_Final =
SWITCH (
    TRUE (),
    LEFT ( Table2[CapID], 2 ) = "CA"
        && Table2[CAPName] = "x12345-Sample"
        && NOT (
            Table2[CapID]
                IN CALCULATETABLE ( VALUES ( Table1[ID] ), Table1[Name] = "x12345-Sample" )
        ), "Undefined_Cap_1",
    LEFT ( Table2[CapID], 2 ) = "CA"
        && Table2[CAPName] = "z12345-Sample"
        && NOT (
            Table2[CapID]
                IN CALCULATETABLE ( VALUES ( Table1[ID] ), Table1[Name] = "z12345-Sample" )
        ), "Undefined_Cap_2",
    LEFT ( Table2[CapID], 2 ) = "CA"
        && Table2[CAPName] = "a12345-Sample"
        && NOT (
            Table2[CapID]
                IN CALCULATETABLE ( VALUES ( Table1[ID] ), Table1[Name] = "a12345-Sample" )
        ), "Undefined",
    Table1[CapID]
)

您甚至可以对其进行重构,以提高代码效率。假设我没有犯任何逻辑错误:

CapID_Final =
VAR IDs =
    CALCULATETABLE ( VALUES ( Table1[ID] ), Table1[Name] = Table2[CAPName] )
RETURN
    IF (
        LEFT ( Table2[CapID], 2 ) = "CA"
            && NOT ( Table2[CapID] IN IDs ),
        SWITCH (
            Table2[CAPName],
            "x12345-Sample", "Undefined_Cap_1",
            "z12345-Sample", "Undefined_Cap_2",
            "a12345-Sample", "Undefined"
        ),
        Table1[CapID]
    )

答案 1 :(得分:0)

作为最佳实践,请勿使用计算列。实际上,如果广泛使用它们,则会减慢您的模型刷新速度,并严重增加您的模型权重(因为它们未压缩)。而是在您的后端数据库或使用M Query计算它。
话虽如此,使用SWITCH函数可以很简单地解决您的问题:

SWITCH ( <Expression>, <Value>, <Result> [, <Value>, <Result> [, … ] ] [, <Else>] )

您的情况如下:

CapIDFinal:=
SWITCH(TRUE(),
AND(CONDITION_1_1, CONDITION_1_2), "Value if condition 1 is true",
AND(CONDITION_2_1, CONDITION_2_2), "Value if condition 2 is true",
"Value if none of above conditions is true
)
相关问题