我需要一些帮助。 下面是我从 Power BI 复制到 Power BI Report Builder 中的 DAX 查询。我希望将参数传递到此查询中以获取“edw dim_paycom_amcs_location_xref”[Paycom_Location_Desc]。 但是,我不确定将其放置在查询中的位置。我已经对此进行了研究,无论我尝试将其放在哪里,我都会收到错误。谁能帮忙解决这个问题吗? 非常感谢。
// DAX Query
DEFINE
VAR __DS0FilterTable =
TREATAS({"2021"}, 'edw dimDate'[Year])
VAR __DS0FilterTable2 =
TREATAS({"August"}, 'edw dimDate'[MonthName])
VAR __DS0Core =
SUMMARIZECOLUMNS(
'edw dimDate'[MonthYear],
'edw dimDate'[Month],
'edw dim_paycom_amcs_location_xref'[Paycom_Location_Desc],
__DS0FilterTable,
__DS0FilterTable2,
"SumOvertime_Hours_by_Day", CALCULATE(SUM('PaycomHours'[Overtime_Hours_by_Day])),
"SumReg_Hours_by_Day", CALCULATE(SUM('PaycomHours'[Reg_Hours_by_Day])),
"Transportation", 'PaycomHours'[Transportation],
"Total_Inbound_Tons", 'PaycomHours'[Total Inbound Tons],
"Total_Inbound_Tons__excl_Yakima_", 'PaycomHours'[Total Inbound Tons (excl Yakima)],
"No_Operating_Days", 'edw dimDate'[No.Operating Days],
"Tonnage_Inbound__3rd_Party", 'PaycomHours'[Tonnage Inbound- 3rd Party],
"Tonnage_Inbound__Intercompany", 'PaycomHours'[Tonnage Inbound- Intercompany],
"Tonnage_Inbound___3rd_Party_Metal", 'PaycomHours'[Tonnage Inbound - 3rd Party Metal],
"Tonnage___Intercompany_Metal", 'PaycomHours'[Tonnage - Intercompany Metal],
"Tonnage___Intercompany_Hog_Fuel", 'PaycomHours'[Tonnage - Intercompany Hog Fuel],
"Tonnage___3rd_Party_Hog_Fuel", 'PaycomHours'[Tonnage - 3rd Party Hog Fuel],
"Total_Commodities_Volume_Sold", 'PaycomHours'[Total Commodities Volume Sold],
"Tonnage___Intercompany_Cardboard", 'PaycomHours'[Tonnage - Intercompany Cardboard],
"Tonnage___Intercompany_ALL", 'PaycomHours'[Tonnage - Intercompany ALL],
"Tonnage___3rd_Party_ALL", 'PaycomHours'[Tonnage - 3rd Party ALL]
)
VAR __DS0PrimaryWindowed =
TOPN(
501,
__DS0Core,
'edw dimDate'[Month],
1,
'edw dimDate'[MonthYear],
1,
'edw dim_paycom_amcs_location_xref'[Paycom_Location_Desc],
1
)
EVALUATE
__DS0PrimaryWindowed
ORDER BY
'edw dimDate'[Month],
'edw dimDate'[MonthYear],
'edw dim_paycom_amcs_location_xref'[Paycom_Location_Desc]
我建议如下:
DEFINE
VAR __DS0FilterTable =
TREATAS ( { "2021" }, 'edw dimDate'[Year] )
VAR __DS0FilterTable2 =
TREATAS ( { "August" }, 'edw dimDate'[MonthName] )
VAR __DS0FilterTable3 =
TREATAS ( { @Location }, 'edw dim_paycom_amcs_location_xref'[Paycom_Location_Desc] )
VAR __DS0Core =
SUMMARIZECOLUMNS (
'edw dimDate'[MonthYear],
'edw dimDate'[Month],
'edw dim_paycom_amcs_location_xref'[Paycom_Location_Desc],
__DS0FilterTable,
__DS0FilterTable2,
__DS0FilterTable3,
[... Remainder of query the same ...]
请务必将
@Location
映射到您的报告参数:
我在报表生成器中使用 DAX 参数时遇到了很多困难。 根据您的需求,有几种不同的方法。
第一个问题,是否需要用户能够改变参数的值? 如果是这样,您需要在报告数据的“参数”下定义它。
接下来,无论您之前的答案如何,您都需要在数据集中定义参数。 如果您使用的是用户可选择的参数,请使用 [@User_Parameter_Name] 屏幕截图中显示的符号。 如果您点击函数编辑器,您将看到它对应于 VB.Net 表达式
=Parameters!User_Parameter_Name.Value
第二个问题是您是否将查询直接输入到数据集属性的查询框中。 如果您只是将 PBI 中的 DAX 粘贴到该框中,那么您应该可以开始了。
但是,如果您正在使用查询设计器(如果您不使用,我也不能责怪您),那么您需要按照您已经发现的方式进行操作,并在查询设计器中重新声明参数。 这里查询参数的问题在于,它们确实很难默认为空值...此外,当我有一个参数时,查询设计器似乎总是忘记我每次打开它时使用的是 DAX 而不是 MDX。
但无论如何,一旦你在这里声明它,那么你就可以在查询本身中引用它们。
最后,如果您需要传递值列表而不是单个值,我让它工作的唯一方法是使用这个奇怪的、文档很少的函数 RSCustomDaxFilter 来创建过滤表:
VAR MonthFilter=
SUMMARIZECOLUMNS (
'Month'[Month],
RSCustomDaxFilter(@MonthQP,EqualToCondition, [Month].[Month], String
)
我可以对这个函数的工作原理做出一些推断; Table.Field 语法和指定对象类型让我认为至少是在 VB.Net 后建模的,但除了如何在几乎仅在这种情况下使用它的示例之外,我还没有找到任何关于它如何工作的官方文档,最好的解释来自 Chris Webb 的博客,早在 2019 年。 此外,如果您不使用查询设计器,那么在执行查询准备时它喜欢冻结!
我使用的 DAX 模式示意图。 无需使用 RSCustomDaxFilter 函数,因此您可以使用 DaxStudio 来处理您的查询。 哈利路亚:}
/*
History
yyyymmdd aa build
Datasets
abbrev = workspace.dataset.table
Notes
+ etc
*/
EVALUATE
-- parse the parameter value lists ready for the main querys
VAR ParameterA = SUBSTITUTE (TRIM (SUBSTITUTE (@ParameterA, ",", "|")), "| ", "|" )
-- build the lists
VAR TableA =
FILTER (
SELECTCOLUMNS (
'table',
"column a", 'table '[column a],
"column b", 'table '[column b],
etc
),
-- column a, ParameterA
SWITCH (
TRUE (),
LEN (ParameterA) = 0, TRUE (), -- ignore
PATHCONTAINS (ParameterA, "All"), TRUE (), -- ignore
IF ( PATHCONTAINS ( ParameterA, "NA" ), -- NA parameter selection
IF ( [column a] IN
{"NA",
"0",
"Not Applicable",
"Select",
" ",
"",
BLANK()},
TRUE (), -- NA value found
IF ( PATHCONTAINS ( ParameterA, [column a] ),
TRUE (), -- direct match found
FALSE () -- out of scope condition
)
),
FALSE ()
),
TRUE (),
PATHCONTAINS ( ParameterA, [column a] ), TRUE (),
FALSE ()
) &&
etc
)
VAR TableB =
etc
-- join the lists
VAR Result =
NATURALINNERJOIN (TableA, TableB)
RETURN
Result
--ROW ( "ParameterA", """"& ParameterA &"""" ) -- parameter checker
ORDER BY
[column a] ASC,
[column b] ASC
/* testing framework daxstudio */
<Parameters etc
<Parameter>
<Name></Name>
<Value xsi:type="xsd:string"></Value>
</Parameter>
etc
</Parameters>
参数dax查询示例(部门),上面的模式是你的主要dax查询。
DEFINE
-- create summary table
VAR SummaryTableUnique =
-- distinct list of values, excluding 'blank's
FILTER (
DISTINCT (
VALUES ( 'Measure Benefit Master'[Dept ID] )
),
NOT [Dept ID] IN {
"NA",
"0",
"Not Applicable",
"Select",
" ",
"",
BLANK()
}
)
-- add sorting column
VAR SummaryTable =
ADDCOLUMNS (
SummaryTableUnique,
"Sort", 1
)
-- create All row
VAR AllTable =
DATATABLE (
"Dept ID", STRING,
"Sort", INTEGER,
{
{ "All", 0 }
}
)
-- create NA row
VAR NATable =
DATATABLE (
"Dept ID", STRING,
"Sort", INTEGER,
{
{ "NA", 0 }
}
)
-- sandwich together
VAR UnionTable1 = UNION ( SummaryTable, AllTable ) -- keep data lineage by doing SummaryTable first
VAR UnionTable2 = UNION ( UnionTable1, NATable )
EVALUATE
UnionTable2
ORDER BY
[Sort] ASC, -- sort All, NA first then all others
[Dept ID] ASC
enter code here