按更细粒度的值进行 MDX 过滤

MDX filtration by more granular value

我有一个 MDX 查询:

    SELECT
    ({[Measures].[Sales Count]}) ON COLUMNS, 
    {Filter([Creation Date].[Day].Members, 
    ([Creation Date].[Day].CurrentMember.Name >= '2016/09/01' AND 
    [Creation Date].[Day].CurrentMember.Name <= '2016/09/05'))} ON ROWS  
           FROM [Date Sales Schema]

它允许我 select 计算日期范围内的销售额。 此外,我可能会通过将 [Creation Date].[Day] 查询中的 [Creation Date].[Day] 替换为 [Creation Date].[Minute] 来按分钟过滤。 但是,如果我想按分钟过滤,并得到结果,销售计数按,我不知道,我必须写什么查询?

例如: 过滤从 9 月 8 日 - 15:57 到 9 月 10 日 - 13:35 - 结果应该是:

此类查询接近决策:

SELECT 
  {[Measures].[Sales Count]} ON COLUMNS
 ,Exists
  (
    [Creation Date].[Day].MEMBERS
   ,Filter
    (
      [Creation Date].[Minute].MEMBERS
     ,
        [Creation Date].[Minute].CurrentMember.Name >= '2016/09/01 15:57'
      AND 
        [Creation Date].[Minute].CurrentMember.Name <= '2016/09/10 15:57'
    )
  ) ON ROWS
FROM [Date Sales Schema];

但是,例如,如果我在 10.02.2016 23:55 进行了一次销售,并且过滤器从 10.02.2016 23:54 开始,则显示所有内容的请求的结果10.02 的销售额。

下一个查询是计算所有时间段的总和并将总和打印为每个天维度的度量:

WITH MEMBER [Measures].[Day Period Sales Count] AS Aggregate(Filter
    (
      [Creation Date].[Minute].MEMBERS
     ,
        [Creation Date].[Minute].CurrentMember.Name >= '2016/09/01 07:27'
      AND 
        [Creation Date].[Minute].CurrentMember.Name <= '2016/09/01 15:57'
    )
)
SELECT 
([Measures].[Day Period Sales Count]) ON COLUMNS ,{[Creation Date].[Day].[2016/09/01],[Creation Date].[Day].[2016/09/02]} ON ROWS
FROM [Date Sales Schema]

但它不按天数划分结果

您可以将分钟过滤器放在子select:

SELECT 
  {[Measures].[Sales Count]} ON COLUMNS
 ,{
    Filter
    (
      [Creation Date].[Day].MEMBERS
     ,
        [Creation Date].[Day].CurrentMember.Name >= '2016/09/01'
      AND 
        [Creation Date].[Day].CurrentMember.Name <= '2016/09/05'
    )
  } ON ROWS
FROM 
(
  SELECT 
    [Creation Date].[Minute].&[1] : [Creation Date].[Minute].&[10] ON 0
  FROM [Date Sales Schema]
);

没有 subselect:

SELECT 
  {[Measures].[Sales Count]} ON COLUMNS
 ,Exists
  (
    [Creation Date].[Day].MEMBERS
   ,Filter
    (
      [Creation Date].[Minute].MEMBERS
     ,
        [Creation Date].[Minute].CurrentMember.Name >= '2016/09/01 15:57'
      AND 
        [Creation Date].[Minute].CurrentMember.Name <= '2016/09/10 15:57'
    )
  ) ON ROWS
FROM [Date Sales Schema];

试试这个:

WITH 
  MEMBER [Measures].[Day Period Sales Count] AS 
    Aggregate
    (
      (EXISTING 
        Filter
        (
          [Creation Date].[Minute].MEMBERS
         ,
            [Creation Date].[Minute].CurrentMember.Name >= '2016/09/01 07:27'
          AND 
            [Creation Date].[Minute].CurrentMember.Name <= '2016/09/01 15:57'
        ))
     ,[Measures].[Sales Count]
    ) 
SELECT 
  [Measures].[Day Period Sales Count] ON COLUMNS
 ,{
    [Creation Date].[Day].[2016/09/01]
   ,[Creation Date].[Day].[2016/09/02]
  } ON ROWS
FROM [Date Sales Schema];

了解您的 Date/Time dimension/s is/are 是如何建造的。

Minutes/Hours 是日期的属性吗?是否有任何层次结构将两者相关联?

您可以将日期设为 RANGE。甚至应该有助于提高性能。

[时间] 部分...SSAS 不准备处理分钟和小时以及日期,除非您实际上在层次结构中将两者相关联,这应该使它非常直接地使用 Range 来获得所有值。就像 whytheq 指出的那样,只需在子 select 中使用范围,并在轴上使用 [Creation Date].[Day]

{[Creation Date].[Full DateTime Hierarchy].&[20160801].&[1557]:[Creation Date].[Full DateTime Hierarchy].&[20160901].&[2359]}

但这在很大程度上取决于您的维度。