使用 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
        )
    )