【问题标题】:Create reusable date table with DAX使用 DAX 创建可重复使用的日期表
【发布时间】:2020-03-17 12:47:25
【问题描述】:

我在 Power BI 中构建了一个包含所有可能的日期列组合的日期表。但是,我想知道是否可以编写一个自动创建所有这些列的 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

我确实了解上面的代码由于多种原因无法正常工作。我对此并不陌生,无法想出不同的方法。

我的最终目标是我有一段代码可以在创建新表时复制粘贴,该表将自动创建我手动创建的所有列一次。

非常感谢任何输入或帮助。

提前非常感谢, 多路复用器

【问题讨论】:

    标签: automation powerbi visualization dax


    【解决方案1】:

    大家!

    我最终弄明白了。可以引用先前定义的列。但是,我必须创建与列查询基本相同的变量。请参阅下面的代码以更好地理解。

    结果: 查询确实工作得很好。我现在唯一需要做的就是在创建新日期表时复制粘贴查询。该逻辑有效,在设置连接并将新表称为 Datetable 之后,日期表逻辑将按预期应用。

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

    【讨论】:

      【解决方案2】:

      你应该使用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" )       
      )
      

      【讨论】:

      • 感谢您的评论@Karl。您是对的,无法引用我在同一语句中定义的列。但是我确实找到了解决方案,请参阅下面的答案。再次感谢您的意见。 MLU
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多