使用 DAX 创建可重用日期 table
Create reusable date table with DAX
我在 Power BI 中使用所有可能的日期列组合构建了一个日期 table。但是,我想知道是否可以编写一个自动创建所有这些列的 DAX 查询。
如何将每个单独列的 DAX 逻辑组合在一起,以便 PowerBI 一次创建所有列。
我最后一次尝试:
DateTable =
VAR BaseCalendar =
CALENDAR(
FIRSTDATE(column X[Date]),
LASTDATE(column X[Date]))
RETURN
GENERATE(
BaseCalendar,
VAR BaseDate = [Date]
VAR YearDate = YEAR(BaseDate)
VAR MonthNumber = MONTH(BaseDate)
RETURN ROW(
"FullYear", YEAR([Date]),
"ShortYear", VALUE(Right(Year([Date]),2)),
"MonthNumber", MONTH([Date]),
"MonthNumberFull", FORMAT([Date], "MM"),
"MonthFull", FORMAT([Date], "MMMM"),
"MonthAbbr", FORMAT([Date], "MMM"),
"WeekNumber", WEEKNUM([Date]),
"WeekNumberFull", FORMAT(Weeknum([Date]), "00"),
"QuarterFull", "Quarter " & ROUNDDOWN(MONTH([Date])/4,0)+1,
"QuarterNumber", ROUNDDOWN(MONTH([Date])/4,0)+1,
"QuarterAndYear", BaseCalendar[QuarterNumber] & " " & [FullYear],
"YearMonthNum", VALUE(BaseCalendar[FullYear] & BaseCalendar[MonthNumberFull]),
"Quarter", "Q" & ROUNDDOWN(MONTH([Date])/4,0)+1,
"ISODate", BaseCalendar[FullYear] & BaseCalendar[MonthNumberFull] & BaseCalendar[DayOfMonthFull],
"DayOfMonth", DAY(BaseCalendar[Date]),
"DayOfMonthFull", FORMAT(DAY(BaseCalendar[Date]),"00"),
"DayOfWeek", WEEKDAY(BaseCalendar[Date],2),
"DayOfWeekFull", FORMAT(BaseCalendar[Date], "DDDD"),
"DayOfWeekAbbr", FORMAT(BaseCalendar[Date], "DDD"),
"DayOfWeekAbbr", FORMAT(BaseCalendar[Date], "DDD"),
"QuarterAbbr", "Qtr" & ROUNDDOWN(MONTH(BaseCalendar[Date])/4,0)+1,
"MonthAndYearAbbr", BaseCalendar[MonthNumberFull] & " " & BaseCalendar[FullYear],
"QuarterAndYearNum", BaseCalendar[FullYear] & BaseCalendar[QuarterNumber],
"QuarterAndYearNum", BaseCalendar[FullYear] & BaseCalendar[QuarterNumber]
)
)
当我将鼠标悬停在带有红色下划线的变量上时,它总是显示:找不到名称:XYZ
我知道上面的代码由于多种原因无法正常工作。我对此很陌生,想不出不同的方法。
我的最终目标是我有一段代码可以在创建新的 table 时复制粘贴,它将自动创建我手动创建的所有列一次。
非常感谢任何输入或帮助。
非常感谢,
MLU
你应该使用 ADDCOLUMNS
,像这样
Date =
ADDCOLUMNS (
CALENDAR ( FIRSTDATE(column X[Date]); LASTDATE(column X[Date]) );
"Quarter"; "Q" & FORMAT ( [Date]; "Q" )
...
...
)
您不能引用您在另一个添加的列中添加的列中的名称。所以这会失败:
Date =
ADDCOLUMNS (
CALENDAR ( FIRSTDATE(column X[Date]); LASTDATE(column X[Date]) );
"Quarter"; "Q" & FORMAT ( [Date]; "Q" );
"Year-Quarter"; FORMAT([Date];"yyyy") & " - " & [Quarter] // < would fail
)
您只能引用 Date
以便获得 Year-Quarter:
Date =
ADDCOLUMNS (
CALENDAR ( FIRSTDATE(column X[Date]); LASTDATE(column X[Date]) );
"Quarter"; "Q" & FORMAT ( [Date]; "Q" );
"Year-Quarter"; FORMAT([Date];"yyyy") & " - Q" & FORMAT ( [Date]; "Q" )
)
大家好!
我终于搞清楚了。可以引用先前定义的列。但是,我必须创建与列查询基本相同的变量。请参阅下面的代码以便更好地理解。
结果:
查询确实工作得很好。我现在唯一需要做的就是在创建新日期时复制粘贴查询 table。该逻辑有效,在设置连接并将新 table 引用为 Datetable 后,日期 table 逻辑按预期应用。
enterDateTableXX =
VAR BaseCalendar =
CALENDAR(
FIRSTDATE(Datatable XX[Date]),
LASTDATE(Datatable XX[Date]))
RETURN
GENERATE(
BaseCalendar,
VAR BaseDate = [Date]
VAR FullYear = YEAR(BaseDate)
VAR MonthNumber = MONTH(BaseDate)
VAR QuarterNumber = ROUNDDOWN(MONTH([Date])/4,0)+1
VAR QuarterAndYear = QuarterNumber & " " & FullYear
VAR MonthNumberFull = FORMAT(BaseDate, "MM")
VAR DayOfMonthFull = FORMAT(DAY(BaseDate),"00")
RETURN ROW(
"FullYear", YEAR(BaseDate),
"ShortYear", VALUE(Right(Year(BaseDate),2)),
"MonthNumber", MONTH(BaseDate),
"MonthNumberFull", FORMAT(BaseDate, "MM"),
"MonthFull", FORMAT(BaseDate, "MMMM"),
"MonthAbbr", FORMAT(BaseDate, "MMM"),
"WeekNumber", WEEKNUM(BaseDate),
"WeekNumberFull", FORMAT(Weeknum(BaseDate), "00"),
"QuarterFull", "Quarter " & ROUNDDOWN(MONTH(BaseDate)/4,0)+1,
"QuarterNumber", ROUNDDOWN(MONTH(BaseDate)/4,0)+1,
"QuarterAndYear", QuarterNumber & " " & FullYear,
"YearMonthNum", VALUE(FullYear & MonthNumberFull),
"Quarter", "Q" & ROUNDDOWN(MONTH([Date])/4,0)+1,
"ISODate", FullYear & MonthNumberFull & DayOfMonthFull,
"DayOfMonth", DAY(BaseDate),
"DayOfMonthFull", FORMAT(DAY(BaseDate),"00"),
"DayOfWeek", WEEKDAY(BaseDate,2),
"DayOfWeekFull", FORMAT(BaseDate, "DDDD"),
"DayOfWeekAbbr", FORMAT(BaseDate, "DDD"),
"QuarterAbbr", "Qtr" & ROUNDDOWN(MONTH(BaseDate)/4,0)+1,
"MonthAndYearAbbr", MonthNumberFull & " " & FullYear,
"QuarterAndYearNum", FullYear & QuarterNumber
)
)
我在 Power BI 中使用所有可能的日期列组合构建了一个日期 table。但是,我想知道是否可以编写一个自动创建所有这些列的 DAX 查询。
如何将每个单独列的 DAX 逻辑组合在一起,以便 PowerBI 一次创建所有列。
我最后一次尝试:
DateTable =
VAR BaseCalendar =
CALENDAR(
FIRSTDATE(column X[Date]),
LASTDATE(column X[Date]))
RETURN
GENERATE(
BaseCalendar,
VAR BaseDate = [Date]
VAR YearDate = YEAR(BaseDate)
VAR MonthNumber = MONTH(BaseDate)
RETURN ROW(
"FullYear", YEAR([Date]),
"ShortYear", VALUE(Right(Year([Date]),2)),
"MonthNumber", MONTH([Date]),
"MonthNumberFull", FORMAT([Date], "MM"),
"MonthFull", FORMAT([Date], "MMMM"),
"MonthAbbr", FORMAT([Date], "MMM"),
"WeekNumber", WEEKNUM([Date]),
"WeekNumberFull", FORMAT(Weeknum([Date]), "00"),
"QuarterFull", "Quarter " & ROUNDDOWN(MONTH([Date])/4,0)+1,
"QuarterNumber", ROUNDDOWN(MONTH([Date])/4,0)+1,
"QuarterAndYear", BaseCalendar[QuarterNumber] & " " & [FullYear],
"YearMonthNum", VALUE(BaseCalendar[FullYear] & BaseCalendar[MonthNumberFull]),
"Quarter", "Q" & ROUNDDOWN(MONTH([Date])/4,0)+1,
"ISODate", BaseCalendar[FullYear] & BaseCalendar[MonthNumberFull] & BaseCalendar[DayOfMonthFull],
"DayOfMonth", DAY(BaseCalendar[Date]),
"DayOfMonthFull", FORMAT(DAY(BaseCalendar[Date]),"00"),
"DayOfWeek", WEEKDAY(BaseCalendar[Date],2),
"DayOfWeekFull", FORMAT(BaseCalendar[Date], "DDDD"),
"DayOfWeekAbbr", FORMAT(BaseCalendar[Date], "DDD"),
"DayOfWeekAbbr", FORMAT(BaseCalendar[Date], "DDD"),
"QuarterAbbr", "Qtr" & ROUNDDOWN(MONTH(BaseCalendar[Date])/4,0)+1,
"MonthAndYearAbbr", BaseCalendar[MonthNumberFull] & " " & BaseCalendar[FullYear],
"QuarterAndYearNum", BaseCalendar[FullYear] & BaseCalendar[QuarterNumber],
"QuarterAndYearNum", BaseCalendar[FullYear] & BaseCalendar[QuarterNumber]
)
)
当我将鼠标悬停在带有红色下划线的变量上时,它总是显示:找不到名称:XYZ
我知道上面的代码由于多种原因无法正常工作。我对此很陌生,想不出不同的方法。
我的最终目标是我有一段代码可以在创建新的 table 时复制粘贴,它将自动创建我手动创建的所有列一次。
非常感谢任何输入或帮助。
非常感谢, MLU
你应该使用 ADDCOLUMNS
,像这样
Date =
ADDCOLUMNS (
CALENDAR ( FIRSTDATE(column X[Date]); LASTDATE(column X[Date]) );
"Quarter"; "Q" & FORMAT ( [Date]; "Q" )
...
...
)
您不能引用您在另一个添加的列中添加的列中的名称。所以这会失败:
Date =
ADDCOLUMNS (
CALENDAR ( FIRSTDATE(column X[Date]); LASTDATE(column X[Date]) );
"Quarter"; "Q" & FORMAT ( [Date]; "Q" );
"Year-Quarter"; FORMAT([Date];"yyyy") & " - " & [Quarter] // < would fail
)
您只能引用 Date
以便获得 Year-Quarter:
Date =
ADDCOLUMNS (
CALENDAR ( FIRSTDATE(column X[Date]); LASTDATE(column X[Date]) );
"Quarter"; "Q" & FORMAT ( [Date]; "Q" );
"Year-Quarter"; FORMAT([Date];"yyyy") & " - Q" & FORMAT ( [Date]; "Q" )
)
大家好!
我终于搞清楚了。可以引用先前定义的列。但是,我必须创建与列查询基本相同的变量。请参阅下面的代码以便更好地理解。
结果: 查询确实工作得很好。我现在唯一需要做的就是在创建新日期时复制粘贴查询 table。该逻辑有效,在设置连接并将新 table 引用为 Datetable 后,日期 table 逻辑按预期应用。
enterDateTableXX =
VAR BaseCalendar =
CALENDAR(
FIRSTDATE(Datatable XX[Date]),
LASTDATE(Datatable XX[Date]))
RETURN
GENERATE(
BaseCalendar,
VAR BaseDate = [Date]
VAR FullYear = YEAR(BaseDate)
VAR MonthNumber = MONTH(BaseDate)
VAR QuarterNumber = ROUNDDOWN(MONTH([Date])/4,0)+1
VAR QuarterAndYear = QuarterNumber & " " & FullYear
VAR MonthNumberFull = FORMAT(BaseDate, "MM")
VAR DayOfMonthFull = FORMAT(DAY(BaseDate),"00")
RETURN ROW(
"FullYear", YEAR(BaseDate),
"ShortYear", VALUE(Right(Year(BaseDate),2)),
"MonthNumber", MONTH(BaseDate),
"MonthNumberFull", FORMAT(BaseDate, "MM"),
"MonthFull", FORMAT(BaseDate, "MMMM"),
"MonthAbbr", FORMAT(BaseDate, "MMM"),
"WeekNumber", WEEKNUM(BaseDate),
"WeekNumberFull", FORMAT(Weeknum(BaseDate), "00"),
"QuarterFull", "Quarter " & ROUNDDOWN(MONTH(BaseDate)/4,0)+1,
"QuarterNumber", ROUNDDOWN(MONTH(BaseDate)/4,0)+1,
"QuarterAndYear", QuarterNumber & " " & FullYear,
"YearMonthNum", VALUE(FullYear & MonthNumberFull),
"Quarter", "Q" & ROUNDDOWN(MONTH([Date])/4,0)+1,
"ISODate", FullYear & MonthNumberFull & DayOfMonthFull,
"DayOfMonth", DAY(BaseDate),
"DayOfMonthFull", FORMAT(DAY(BaseDate),"00"),
"DayOfWeek", WEEKDAY(BaseDate,2),
"DayOfWeekFull", FORMAT(BaseDate, "DDDD"),
"DayOfWeekAbbr", FORMAT(BaseDate, "DDD"),
"QuarterAbbr", "Qtr" & ROUNDDOWN(MONTH(BaseDate)/4,0)+1,
"MonthAndYearAbbr", MonthNumberFull & " " & FullYear,
"QuarterAndYearNum", FullYear & QuarterNumber
)
)