相当于mdx中的max group by

Equivalent to max group by in mdx

如何获取每个产品组和品牌的交叉联接的最后一个产品的销售额?我查看了 Tail 函数,但无法使其正常工作。

这是我目前拥有的 MDX:

SELECT {[Measures].[Sales Amount]} ON COLUMNS,
{
    [Dim Brands].[Brand Name].[Brand Name].ALLMEMBERS *
    [Dim Product Groups].[Product Group Name].[Product Group Name].ALLMEMBERS *
    Tail ([Dim Products].[Product Name].[Product Name].ALLMEMBERS)
}

它只是 returns 整个立方体的最后一个产品,而不是每个品牌和产品组的最后一个产品。

您可以使用 GENERATE 函数为每个组合或品牌和产品组生成产品。 EXISTING 负责范围。

WITH SET LastProductForEachBrandAndProductGroup AS

    GENERATE

    (
       EXISTING
        NonEmpty
        (
            [Dim Brands].[Brand Name].[Brand Name].ALLMEMBERS, [Dim Product Groups].[Product Group Name].[Product Group Name].ALLMEMBERS
        )

    ,

    Tail (
            [Dim Products].[Product Name].[Product Name].ALLMEMBERS
         )

    )


SELECT {[Measures].[Sales Amount]} ON COLUMNS,
NonEmpty({
    [Dim Brands].[Brand Name].[Brand Name].ALLMEMBERS *
    [Dim Product Groups].[Product Group Name].[Product Group Name].ALLMEMBERS *
    LastProductForEachBrandAndProductGroup
}) ON ROWS
FROM YourCube

如果最后,您暗示任何已排序(按某种程度)列表中的最后一个成员,则以上内容需要更多工作。让我知道你的结果如何。

分离集合应该会加快此脚本的速度。像下面这样:

WITH 
  SET [allBrands] AS 
    [Dim Brands].[Brand Name].[Brand Name].ALLMEMBERS 
  SET [allGroups] AS 
    [Dim Product Groups].[Product Group Name].[Product Group Name].ALLMEMBERS 
  SET [A] AS 
    Generate
    (
      {[allBrands] * [allGroups]} AS s
     ,
        s.Current
      * 
        Tail
        (
          NonEmpty
          (
            [Dim Products].[Product Name].[Product Name].ALLMEMBERS
           ,[Measures].[Sales Amount]
          )
         ,1
        )
    ) 
SELECT 
  NON EMPTY 
    {[Measures].[Sales Amount]} ON 0
 ,NON EMPTY 
    [A] ON 1
FROM [YourCube];

针对 Microsoft 的 AdvWrks,上述的一个类似且可能更有用的变体是使用 TopCount 而不是略带艺术性的 Tail:

WITH 
  SET [allYears] AS 
    [Date].[Calendar].[Calendar Year].MEMBERS 
  SET [allCountries] AS 
    [Customer].[Customer Geography].[Country].MEMBERS 
  SET [A] AS 
    Generate
    (
    {[allYears] * [allCountries]} AS s
     ,
        s.Current
      * 
        TopCount
        (
          [Product].[Product Categories].[Product].ALLMEMBERS
         ,2
         ,[Measures].[Internet Sales Amount]
        )
    ) 
SELECT 
  {[Measures].[Internet Sales Amount]} ON 0
 ,[A] ON 1
FROM [Adventure Works];

结果如下: