如何从 MDX 查询中提取日期中的月份年份

Posted

技术标签:

【中文标题】如何从 MDX 查询中提取日期中的月份年份【英文标题】:How to extract month-year from date from MDX Query 【发布时间】:2016-02-26 10:23:27 【问题描述】:

我需要使用不包含日期的日期过滤来自 Cube 的数据。 目前我正在使用以下 MDX 查询,即从一年中的第一天开始到最后一天结束获取度量数据。

但是,我只想在行的日期时间中使用 Month-Year,而不是在所有日期中使用 DateTime。 (这里我的日期字段是:[Period].[TransportDate])

下面是 MDX 查询。

SELECT 
  NON EMPTY 
     
      [Measures].[ConsignmentCount]
    , [Measures].[CBM]
    , [Measures].[LDM]
    , [Measures].[Weight]
    , [Measures].[Amount]  ON COLUMNS,
  NON EMPTY 
     [Period].[TransportDate].Children  ON ROWS
FROM 
  ( 
     SELECT 
      ( 
         [Period].[YearAndMonth].[ConsignmentYear].&[2014]
        , [Period].[YearAndMonth].[ConsignmentYear].&[2015]  
      ) ON COLUMNS
      FROM [RebellOlap]
   )

上面的查询从 2015 年的第一天到最后一天获取所有记录。见附图 (allRecords)

但我想以某种方式采用以下方式(必需的数据集) 我想要单列而不是月份和年份。所以 最终数据集应该是

(例如日期(07-2015),金额,CBM,LDM,Num,.寄售)

我知道有一种方法可以从整个日期中仅提取月份和年份。但这仅适用于单个日期。我想要的所有日期都必须经过过滤,包括月份和年份,并且数据也应该相应地对应于这些日期。见上面预期的过滤数据集。

编辑

WITH MEMBER [YearMo] AS 
     [Period].[ConsignmentYear].Currentmember.Name 
     + "-" + 
     [Period].[ConsignmentMonth].Currentmember.Name
SELECT 
  NON EMPTY 
     
      [Measures].[ConsignmentCount]
    , [Measures].[CBM]
    , [Measures].[LDM]
    , [Measures].[Weight]
    , [Measures].[Amount] 
    ON COLUMNS , 
NON EMPTY 
   (
       
       [Period].[YearAndMonth].[ConsignmentMonth] 
      
   ) ON ROWS 
FROM 
  ( 
     SELECT 
        ( 
           
            [Period].[YearAndMonth].[ConsignmentYear].&[2014]
          , [Period].[YearAndMonth].[ConsignmentYear].&[2015] 
           
        ) ON COLUMNS
     FROM [RebellOlap]
  )

上面产生结果但没有年份。

我想以某种方式在同一列上显示年份和月份。 所以 01 将成为 01-2014。 你能帮我吗

没有串联的结果

【问题讨论】:

我的回答有帮助吗,还是可以删除? 【参考方案1】:

您必须在维度视图(cube design-sql 视图)中创建一个新字段为“YYYY-mm”,或者您可以连接年份和月份维度属性(示例如下)。

示例代码:

WITH MEMBER [YearMo] AS 
   [Period].[Monthly].Currentmember.Name 
    + "-" + [Period].[YearAndMonth].Currentmember.Name 
SELECT 
  NON EMPTY [Measures].[ConsignmentCount], [Measures].[CBM], [Measures].[LDM], [Measures].[Weight], [Measures].[Amount] ON COLUMNS 
, NON EMPTY (  [Period].[Monthly].[Year]  ,  [Period].[YearAndMonth].[ConsignmentMonth]  ) ON ROWS 
FROM 
  ( 
    SELECT (  [Period].[YearAndMonth].[ConsignmentYear].&[2014], [Period].[YearAndMonth].[ConsignmentYear].&[2015]  ) ON COLUMNS 
    FROM [RebellOlap]
   ) 

【讨论】:

嗨 Usman,修改了上面的代码。请检查并告诉我。 嗨,Hari:我没有任何等级 [Period].[Monthly]。我的层次结构是:[Period].[YearAndHalf]、[Period].[YearAndMonth]、[Period].[YearAndQuarter] 和 [Period].[YearAndWeek] 我认为,不知何故我们没有正确使用连接。在行上,我们需要像 ('YYYY-MM') => 2014-04 这样的连接,所以我不这么认为, [Period].[Monthly].[Year] , [Period].[YearAndMonth].[ ConsignmentMonth] 将不起作用。因为它不是串联。而且,我根本没有任何 [Period].[Monthly] 层次结构。 亲爱的 Hari,现在我得到了几乎正确的结果,看来我离目标很近了。我在这里需要的只是串联以获得单个字段而不是不同的集合。所以我需要它而不是 2014|1 (2014-01)。因此,我们需要在行级别进行连接,请参阅编辑以在使用 [Period].[YearAndQuarter] 的建议后获得最​​终结果。 然后试试下面的代码,用 MEMBER [YearMo] AS [Period].[YearAndQuarter].Currentmember.Name + "-" + [Period].[YearAndMonth].Currentmember.Name SELECT NON EMPTY [Measures].[ConsignmentCount], [Measures].[CBM], [Measures].[LDM], [Measures].[Weight], [Measures].[Amount] ON COLUMNS , NON EMPTY ( [Period) ].[YearAndQuarter].[ConsignmentYear] , [Period].[YearAndMonth].[ConsignmentMonth] ) ON ROWS FROM ( SELECT ( [Period].[YearAndMonth].[ConsignmentYear].&[2014], [ Period].[YearAndMonth].[ConsignmentYear].&[2015] ) 在 [RebellOlap] 的列上)【参考方案2】:

也许尝试将计算成员托管在不同的层次结构中。我猜到了这个[Forwarder].[Forwarder].[All],你需要调整到你的立方体中存在的层次结构:

WITH MEMBER [Forwarder].[Forwarder].[All].[YearMo] AS 
     [Period].[Year].Currentmember.Name 
     + "-" + 
     [Period].[Month].Currentmember.Name
SELECT 
  NON EMPTY 
     
      [Measures].[ConsignmentCount]
    , [Measures].[CBM]
    , [Measures].[LDM]
    , [Measures].[Weight]
    , [Measures].[Amount] 
    ON COLUMNS , 
NON EMPTY 
      [Period].[Year].[Year]
     *[Period].[Month].[Month]
     *[Forwarder].[Forwarder].[All].[YearMo] 
     ON ROWS 
FROM 
  ( 
     SELECT 
        ( 
           
            [Period].[YearAndMonth].[ConsignmentYear].&[2014]
          , [Period].[YearAndMonth].[ConsignmentYear].&[2015] 
           
        ) ON COLUMNS
     FROM [RebellOlap]
  )

或者如果上述产生错误,那么您可能需要先创建一个度量:

WITH 
MEMBER [Measures].[YearMoString] AS 
     [Period].[Year].Currentmember.Name 
     + "-" + 
     [Period].[Month].Currentmember.Name
MEMBER [Forwarder].[Forwarder].[All].[YearMo] AS 
     (
       [Forwarder].[Forwarder].[All]
      ,[Measures].[YearMoString]
     )
SELECT 
  NON EMPTY 
     
      [Measures].[ConsignmentCount]
    , [Measures].[CBM]
    , [Measures].[LDM]
    , [Measures].[Weight]
    , [Measures].[Amount] 
    ON COLUMNS , 
NON EMPTY 
      [Period].[Year].[Year]
     *[Period].[Month].[Month]
     *[Forwarder].[Forwarder].[All].[YearMo] 
     ON ROWS 
FROM 
  ( 
     SELECT 
        ( 
           
            [Period].[YearAndMonth].[ConsignmentYear].&[2014]
          , [Period].[YearAndMonth].[ConsignmentYear].&[2015] 
           
        ) ON COLUMNS
     FROM [RebellOlap]
  )

【讨论】:

以上是关于如何从 MDX 查询中提取日期中的月份年份的主要内容,如果未能解决你的问题,请参考以下文章

如何在sequelize ORM中使用从时间戳中选择并提取日期到月份和年份?

如何从 DataFrame 的日期列中提取月份名称和年份

jquery中根据年份月份获取日期

mondrian mdx 过滤日期维度中年份级别的集合

如何从python中的字符串中提取月份和年份?

VBA如何将单元格中的年份转为天数