1

我是 MDX 查询的新手。我编写了一个查询,它使用前导函数来获取(当前周加 1)的值作为每个指标的新列。基本上将当前周值与上周值进行比较。如果没有新成员,查询会在几秒钟内运行。添加新成员后,它会永远运行。请建议优化此查询的方法感谢您的帮助。

WITH
SET [Range] as strtomember
(" [Time].[Week].&["+ Format(DateAdd('d', - DatePart('w', Now(), 2), Now()+7), "yyyy-MM-ddT00:00:00")
           +"]")

:strtomember
(" [Time].[Week].&["+ Format(DateAdd('d', - DatePart('w', Now(), 2), Now()+14), "yyyy-MM-ddT00:00:00")
           +"]")

MEMBER [Measures].[SalesNew] as
CASE   WHEN [Time].[Year].CURRENTMEMBER IS [Time].[Year].&[2019] THEN
sum([Time].[Day].CURRENTMEMBER.LEAD(7),[Measures].[Sales Prev])
ELSE null
END,FORMAT_STRING = "$#,###.00"

MEMBER [Measures].[Order UnitsNew] as
CASE   WHEN [Time].[Year].CURRENTMEMBER IS [Time].[Year].&[2019] THEN
sum([Time].[Day].CURRENTMEMBER.LEAD(7),[Measures].[Order Units Prev])
ELSE null
END,FORMAT_STRING = "#,##0"

MEMBER [Measures].[Count of OrdersNew] as
CASE   WHEN [Time].[Year].CURRENTMEMBER IS [Time].[Year].&[2019] THEN
sum([Time].[Day].CURRENTMEMBER.LEAD(7),[Measures].[Count of Orders Prev])
ELSE null
END,FORMAT_STRING = "#,##0"

SELECT
    {  [Measures].[Sales],[Measures].[Sales Prev],[Measures].[SalesNew],[Measures].[Order Units],[Measures].[Order Units Prev],
     [Measures].[Order UnitsNew], [Measures].[Count of Orders],[Measures].[Count of Orders Prev], [Measures].[Count of OrdersNew]} ON COLUMNS ,
      [Range] *
      [Time].[Day].[Day].ALLMEMBERS * -- 4
      [Time].[Hour].ALLMEMBERS *
      [Product].[Merch Dept].ALLMEMBERS *
      [Product].[Class].ALLMEMBERS ON ROWS
FROM [Cube]
4

1 回答 1

0

MDX看起来很酷。优化MDX有点黑魔法——你只需要尝试替代方案。

最初我会尝试:

1.交换strToSet而不是两个strToMember功能。
2.你需要条件[Time].[Year].CURRENTMEMBER IS [Time].[Year].&[2019]吗?我问的原因是那[Range]似乎已经是 2019 年了,你交叉加入了那个系列,所以你需要担心 2019 年吗?
3.您可以使用简单的元组而不是聚合SUM
4.也许在测试时可能值得删除 format_strings - 应该没有什么区别,但如果是这样,您可以添加回来。

我没有测试以下内容,请原谅错别字:

WITH
SET [DateSet] AS
strtoSet
(
   "[Time].[Week].&[" 
  + Format(DateAdd('d', - DatePart('w', Now(), 2), Now()+7), "yyyy-MM-ddT00:00:00")
  + "]:[Time].[Week].&["
  + Format(DateAdd('d', - DatePart('w', Now(), 2), Now()+14), "yyyy-MM-ddT00:00:00")
  +"]"
)
MEMBER [Measures].[SalesNew] AS
(
   [Time].[Day].CURRENTMEMBER.LEAD(7)
  ,[Measures].[Sales Prev]
)
MEMBER [Measures].[Order UnitsNew] AS
(
   [Time].[Day].CURRENTMEMBER.LEAD(7)
  ,[Measures].[Order Units Prev]
)
MEMBER [Measures].[Count of OrdersNew] AS
(
    [Time].[Day].CURRENTMEMBER.LEAD(7)
   ,[Measures].[Count of Orders Prev]
)
SELECT
    {  
       [Measures].[Sales]
      ,[Measures].[Sales Prev]
      ,[Measures].[SalesNew]
      ,[Measures].[Order Units]
      ,[Measures].[Order Units Prev]
      ,[Measures].[Order UnitsNew]
      ,[Measures].[Count of Orders]
      ,[Measures].[Count of Orders Prev]
      ,[Measures].[Count of OrdersNew]
    } ON COLUMNS ,
      [DateSet] *
      [Time].[Day].[Day].ALLMEMBERS * 
      [Time].[Hour].ALLMEMBERS *
      [Product].[Merch Dept].ALLMEMBERS *
      [Product].[Class].ALLMEMBERS ON ROWS
FROM [Cube];
于 2019-03-31T15:37:48.687 回答