Powerbi 转换Case语句,从t-SQL查询筛选到DAX
我在将下面的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列,该查询工作得非常好-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
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]
)