【问题标题】:MDX DateAdd function over a set of tuples一组元组上的 MDX DateAdd 函数
【发布时间】:2014-03-25 09:08:35
【问题描述】:

我正在尝试使用 DateAdd() 函数创建一组日期,但在尝试将一组元组作为参数传递时出现错误。 下面的代码返回一个成员,但我正在寻找一组新日期。

有 成员 [EFF INJ DT] AS DATEADD("M",12, [受伤日期].CurrentMember)

SELECT {[EFF INJ DT]} ON COLUMNS, [INJURY DATE].[DATE].Members ON ROWS
FROM [WVWC DATA CUBE FROI SROI]

我有以下尝试:

 WITH 
Set [EFF INJ DT] AS 
DATEADD("M",12, [INJURY DATE].CurrentMember)

SELECT {[EFF INJ DT]} ON COLUMNS, [INJURY DATE].[DATE].Members ON ROWS
FROM [WVWC DATA CUBE FROI SROI]

【问题讨论】:

  • 请指定您需要的日期集?
  • 是什么让你认为DATEADD 是一个MDX 函数?

标签: set tuples mdx dateadd


【解决方案1】:

如果您想将 12 名成员向前移动,则使用 Adv Works,您可以通过多种方式进行导航。

试试下面的。它应该在currentmember 前 12 天返回日期:

WITH 
    MEMBER [MEASURES].[EFF INJ DT] AS
        [Date].[Calendar].CurrentMember.LEAD(12).MEMBERVALUE
SELECT 
    {[MEASURES].[EFF INJ DT]}  ON 0,
    {[Date].[Calendar].[Month].&[2006]&[4].CHILDREN} ON 1
FROM [Adventure Works];

看起来您想返回未来 12 个月的日期。

所以首先我们需要通过ANCESTOR 函数与currentmember 对应的年份> 然后使用COUSIN 函数前进到对应的日期,如下所示:

WITH 
    MEMBER [MEASURES].[EFF INJ DT] AS
    COUSIN(
        [Date].[Calendar].CurrentMember, 
        ANCESTOR(
            [Date].[Calendar].CurrentMember, 
            [Date].[Calendar].[Calendar Year]).LEAD(1)
            ).membervalue   
SELECT 
    {[MEASURES].[EFF INJ DT]}  ON 0,
    {[Date].[Calendar].[Month].&[2006]&[4].CHILDREN} ON 1
FROM [Adventure Works];

适应您的场景并假设INJURY DATE 是多级user hierarchy' that contains another level calledCalendar Year`,您可以执行以下操作:

WITH 
    MEMBER [MEASURES].[EFF INJ DT] AS
        COUSIN(
            [INJURY DATE].CurrentMember, 
            ANCESTOR(
                [INJURY DATE].CurrentMember, 
                [INJURY DATE].[Calendar Year]).LEAD(1)
                ).MEMBERVALUE   
SELECT 
    {[MEASURES].[EFF INJ DT]}  ON 0,
    {[INJURY DATE].[DATE].Members} ON 1
FROM [Adventure Works];

编辑

通过 VBA 工具,我们在 Adv Wrks 中有以下内容:

WITH 
    MEMBER [MEASURES].[EFF INJ DT] AS
      DATEADD(
      "M",
      12,
      [Date].[Calendar].CurrentMember.membervalue 
      )  
SELECT 
    {[MEASURES].[EFF INJ DT]}  ON 0,
    {[Date].[Calendar].[Month].&[2006]&[4].CHILDREN} ON 1
FROM [Adventure Works];

适应您的场景:

WITH 
    MEMBER [MEASURES].[EFF INJ DT] AS
    DATEADD(
    "M",
    12,
    [INJURY DATE].CurrentMember.membervalue 
    )  
SELECT 
    {[MEASURES].[EFF INJ DT]}  ON 0,
    {[INJURY DATE].[DATE].Members} ON 1
FROM [Adventure Works];

【讨论】:

  • 感谢Whytheq 的快速回复。您提供的代码不符合我的目的。它给了我从当前日期开始的下一个成员的日期,但我正在寻找正好比当前时间提前 12 个月的日期。在我的 [Injury Date] 维度中,年份之间存在间隔(1920、1921、1924、1930、1931 等)因此,这段代码为我提供了当前日期的下一个日期(即 1924 年之后它给出了 1930 年),而我需要 1925 年。这就是为什么我试图做一个 DateAdd()..
  • 您可以在“MDX”中开始使用字符串和VBA 函数 - 这里有一个参考可以帮助您开始: (social.msdn.microsoft.com/Forums/sqlserver/en-US/…) 在 SSAS 和SQL-Server,然后使用 T-SQL 函数OPENQUERY 将数据拉到 sql 中,然后开始使用它。
  • (p.s. 日期维度中的间隙是非常糟糕的设计)
  • 我知道如果我有整个日历会容易得多,但我只处理伤病日期,所以会有差距。我已经尝试过实现 VBA 日期功能,但还没有找到正确的解决方案。
  • 我现在有了解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
相关资源
最近更新 更多