Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powerbi 转换Case语句,从t-SQL查询筛选到DAX_Powerbi_Dax_Powerquery - Fatal编程技术网

Powerbi 转换Case语句,从t-SQL查询筛选到DAX

Powerbi 转换Case语句,从t-SQL查询筛选到DAX,powerbi,dax,powerquery,Powerbi,Dax,Powerquery,我在将下面的t-sql查询转换为DAX时遇到问题 概述-有两个示例表-表1和表2,模式如下 表1(ID varchar(20),名称varchar(30)) 表2(CapID varchar(20)、CAPName varchar(30)、CapID_Final varchar(20)) 请注意:表2中的[ID]与表1中的[CapID]之间存在一对多关系 我试图根据下面的t-SQL查询中的条件导出表2中的CapID_Final列,该查询工作得非常好- SELECT CASE WHE

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

概述-有两个示例表-表1和表2,模式如下

表1(ID varchar(20),名称varchar(30))

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

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

我试图根据下面的t-SQL查询中的条件导出表2中的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的计算列中,对幂BI中的CapID_Final列进行相同的推导

到目前为止,我已经尝试了下面的代码——但即使是匹配的条件,它也会返回“Undefined”-

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吗?

作为最佳实践,请不要使用计算列。事实上,如果广泛使用,它们会减慢模型刷新速度,并严重增加模型权重(因为它们没有被压缩)。相反,可以在后端数据库中或使用M Query进行计算。
话虽如此,您的问题的解决方案非常简单,只需使用一个函数:

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

开关
基本上相当于
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]
    )

嗨,亚历克西斯,非常感谢。。第一个查询工作正常,因为我验证了CAPID_FInal的结果。。然而,当我试图在表1中的ID和表2中的CAPID_Final之间建立关系时,它产生了循环依赖。你能建议,我应该怎么做来防止它吗?我想在M query中尝试一下-但是,我不确定如何在IF语句中为下面的DAX编写子查询逻辑?在CALCULATETABLE(值(Table1[ID]),Table1[Name]=“x12345示例”)中,非常感谢西摩。我应该如何为下面DAX的IF语句中的子查询编写逻辑?在DAX.GUIDE网站的CALCULATETABLE(VALUES(Table1[ID])、Table1[Name]=“x12345 Sample”)中,您可以找到所需的所有函数,也可以打开与其他函数特别相关的其他问题。这是关于如何将SQL案例转换为DAX,答案是使用SWITCH函数
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]
    )