excel 将函数应用于查询自定义列中的每一行

mklgxw1f  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(251)

问题总结:

我在Excel中有一个包含13列的PowerQuery表。第13列是自定义列"任务开始周数"。**我希望PowerQuery将公式应用于为此查询生成的每一行。**公式如下:

=IFS(AND('Program Dates'!$B$2<WEEKNUM(New_Items_to_Save[Start Date]),
WEEKNUM(New_Items_to_Save[Start Date])<54),
'Program Dates'!$G$2-('Program Dates'!$D$2-(-53+WEEKNUM(New_Items_to_Save[Start Date]))),
WEEKNUM(New_Items_to_Save[Start Date])<'Program Dates'!$B$2,
'Program Dates'!$G$2-('Program Dates'!$D$2-(-53+WEEKNUM(New_Items_to_Save[Start Date])))+53)

我在这里所做的是引用一个包含公式的单元格,这样我就可以对一个命名的区域运行GetValue()函数,我不能让它工作,我不知道我做错了什么。
提前感谢您的帮助!

上下文:

This is the query table I need to add the calculation to.
最后一列是自定义列,应使用以下单元格计算这些值:
This is the source of the other info needed to calculate the week number of the program, with reference arrows shown.

    • 注意:**函数中引用的日期已使用WEEKNUM()操作进行了转换。我比较的是周#与周#,而不是日期与周#

功能逻辑:

    • 和:**如果日期在当前年份范围内,即周数小于54,但在程序开始后,则执行此计算。
    • IFS:**否则,如果第#周在计划结束前,即2023年,则执行此计算。

编辑:

下面是我要为这个自定义列中的每个新单元格调用的PowerQuery函数:

Parameter2 = Date.WeekOfYear(StartWeek)
let
    GetWeek = ()
    if GetValue("Start_Week") < Parameter2 < 54
    then (GetValue("Program_Duration") - GetValue("End_Week") + 53 - Parameter2)) 
    else
    (GetValue("Program_Duration") - GetValue("End_Week") + 53 - Parameter2 +53))
in 
    GetWeek

我不知道我是否需要let语句或者我是否应该把它放在一个函数中
f(x)=〉[方程]
然后在幂查询中调用"... each f([列名])"?

kq4fsx7k

kq4fsx7k1#

我认为你的问题实际上有三个不同的部分,也许你的困惑来自于把它们都结合在一起。
我的看法是在这些部分:
1.如何创建一个 * 自定义 * 函数。
1.如何将函数应用于 * new * 列。
1.如何将函数应用于 * existing * 列。

如何创建 * 自定义 * 函数

在Power Query中创建自定义函数的主要方法有两种:
1.使用UI(遵循步骤here):
| 步骤|说明|图像|
| - ------| - ------| - ------|
| 1个|编写查询|

|
| 第二章|参数化查询|

|
| 三个|创建您的函数|

|
1.仅使用代码(遵循步骤here):
1.筛选表格的示例:

let fun_FilterTable = (tbl_InputTable as table, txt_FilterValue as text) as table =>
    let
        Source = tbl_InputTable,
        Filter = Table.SelectRows(DayCount, each Text.Contains([Column], txt_FilterValue))
    in
        Filter
in
    fun_FilterTable

1.检查一个字符串是否包含另一个字符串的示例:

let fun_CheckStringContains = (txt_String as text, txt_Check as text) as nullable logical =>
    let
        Source = txt_String,
        Check = Text.Contains(Source, txt_Check)
    in
        Check
in
    fun_CheckStringContains

更多资源:

如何将函数应用于 * new * 列

也有两种不同的实现方式:
1.自定义列(遵循步骤here):
| 步骤|说明|图像|
| - ------| - ------| - ------|
| 1个|创建自定义列|

|
| 第二章|添加功能|

|
1.自定义功能(遵循步骤here):
| 步骤|说明|图像|
| - ------| - ------| - ------|
| 1个|调用自定义函数|

|
资料来源:

如何将函数应用于 * 现有 * 列

也有两种不同的方式来实现(不幸的是,只有纯代码才可能):
1.使用转换:
1.将整列大写的示例:

let
    Source = Table,
    #"Uppercased text" = Table.TransformColumns(Source, {{"Column", each Text.Upper(_), type nullable text}})
in
    #"Uppercased text"

1.向一列中的所有行添加前缀的示例:

let
    Source = Table,
    #"Added prefix" = Table.TransformColumns(Source, {{"Column", each "test_" & _, type text}})
in
    #"Added prefix"

1.将列强制为澳大利亚格式的日期的示例:

let
    Source = Table,
    #"Fix date" = Table.TransformColumns(Source, {{"DateColumn", each Date.From(_, "en-AU"), type date}})
in
    #"Fix date"

1.使用替代品
1.替换某些文本的示例:

let
    Source = Table,
    #"Replaced value" = Table.ReplaceValue(Source, "Admin", "Administrator", Replacer.ReplaceText, {"Column"})
in
    #"Replaced value"

1.替换为另一列

let
    Source = Table,
    #"Replaced value" = Table.ReplaceValue(Source, each [FixThisColumn], each [OtherColumn], Replacer.ReplaceText, {"FixThisColumn"})
in
    #"Replaced value"

中的值的示例

您的具体问题

没有一些虚拟数据可以使用,我在这里创建了一些。请注意,在将来,请提供一些数据在一个最小的可复制的例子(见here),以便我们可以很容易地从您的例子重新创建场景。
数据:
| 识别号|项目开始日期|程序结束日期|
| - ------| - ------| - ------|
| 1个|2020年1月1日|二○二一年十二月一日|
| 第二章|2022年1月1日|2023年3月1日|
| 三个|2022年3月1日|二○二二年十二月一日|
| 四个|2021年9月1日|二○二三年十二月一日|
| 五个|2023年1月1日|二○二三年十二月一日|
我认为您应该结合使用PowerQuery内置日期函数(请参见here)和一些PowerQuery条件流程(请参见here)。
我的代码看起来像这样:

let
    Source = Table.FromColumns({{1,2,3,4,5},{"1/Jan/2020","1/Jan/2022","1/Mar/2022","1/Sep/2021","1/Jan/2023"},{"1/Dec/2021","1/Mar/2023","1/Dec/2022","1/Dec/2023","1/Dec/2023"}},{"ID","ProgramStartDate","ProgramEndDate"}),
    fix_Types = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"ProgramStartDate", type date}, {"ProgramEndDate", type date}}),
    add_Today = Table.AddColumn(fix_Types, "DateToday", each Date.From(DateTime.LocalNow()), type date),
    add_CheckCurrentYear = Table.AddColumn(add_Today, "IsInCurrentYear", each Date.IsInCurrentYear([DateToday]), type logical),
    add_CheckProgramRunning = Table.AddColumn(add_CheckCurrentYear, "ProgramIsCurrent", each [DateToday]>[ProgramStartDate] and [DateToday]<[ProgramEndDate], type logical),
    add_ConditionalCheck = Table.AddColumn(add_CheckProgramRunning, "DoSomething", each if [IsInCurrentYear] and [ProgramIsCurrent] then "Do Something" else null, type text)
in
    add_ConditionalCheck

最后的输出将如下所示:
| 识别号|项目开始日期|程序结束日期|今天日期|在当前年份|程序是当前的|做点什么|
| - ------| - ------| - ------| - ------| - ------| - ------| - ------|
| 1个|2020年1月1日|2021年1月12日|二○二二年十二月二十二日|正确|错误|* 无效 |
| 第二章|2022年1月1日|二○二三年三月一日|二○二二年十二月二十二日|正确|正确|做点什么|
| 三个|2022年3月1日|2022年1月12日|二○二二年十二月二十二日|正确|错误|
无效 |
| 四个|二○二一年九月一日|二〇二三年一月十二日|二○二二年十二月二十二日|正确|正确|做点什么|
| 五个|2023年1月1日|二〇二三年一月十二日|二○二二年十二月二十二日|正确|错误|
无效 *|
这将有助于您解决问题。

相关问题