如何获得一个;(全部)“;SSAS/MDX中用户定义层次结构中级别的值

如何获得一个;(全部)“;SSAS/MDX中用户定义层次结构中级别的值,ssas,mdx,Ssas,Mdx,我正在尝试找出如何在用户定义的层次结构中获得某个级别的总计。例如,如果我这样做(在这里使用Adventure works): 我得到每对年/月值的总数 如何使用日期维度中的日历用户层次结构重写此查询?例如: SELECT [Measures].[Internet Sales Amount] ON 0, ([Date].[Calendar].[Year] * [Date].[Calendar].[Month]) ON 1 FROM [Adventure Works] 使用现有的allmember

我正在尝试找出如何在用户定义的层次结构中获得某个级别的总计。例如,如果我这样做(在这里使用Adventure works):

我得到每对年/月值的总数

如何使用日期维度中的日历用户层次结构重写此查询?例如:

SELECT [Measures].[Internet Sales Amount] ON 0,
([Date].[Calendar].[Year] * [Date].[Calendar].[Month]) ON 1
FROM [Adventure Works]

使用现有的allmembers应该返回所有行,然后每年和每月返回。如果您只对all行感兴趣,可以将查询更改为:

SELECT [Measures].[Internet Sales Amount] ON 0,
([Date].[Calendar Year] * [Date].[Month of Year]) ON 1
FROM [Adventure Works]
请注意它是如何仅指定维度和层次结构的

如果要在不使用all行的情况下获取数据,请使用以下命令:

SELECT [Measures].[Internet Sales Amount] ON 0,
([Date].[Calendar Year].children * [Date].[Month of Year].children) ON 1
FROM [Adventure Works]
你可以用

SELECT [Measures].[Internet Sales Amount] ON 0,
Hierarchize([Date].[Calendar].[Calendar Year] + [Date].[Calendar].[Month]) ON 1
FROM [Adventure Works]
这将显示您每年在月份之前包含其值(其中包含的月份之和)

+
是MDX中的
联合
的缩写形式,并且
层次化
按层次顺序对集合排序,这意味着父集合优先于子集合

如果你想得到与你的第一个结果相似的结果,我能想象的最接近的事情就是通过这样的计算方法:

WITH Member Measures.Year AS
            IIf([Date].[Calendar].CurrentMember.Level IS [Date].[Calendar].[Calendar Year],
                [Date].[Calendar].CurrentMember.Name,
                Ancestor([Date].[Calendar].CurrentMember, [Date].[Calendar].[Calendar Year]).Name
               )
     Member Measures.Month AS
            IIf([Date].[Calendar].CurrentMember.Level IS [Date].[Calendar].[Month],
                [Date].[Calendar].CurrentMember.Name,
                'All Months'
               )
SELECT {
        Measures.Year,
        Measures.Month,
        [Measures].[Internet Sales Amount]
       }
       ON 0,
Hierarchize([Date].[Calendar].[Calendar Year] + [Date].[Calendar].[Month]) ON 1
FROM [Adventure Works]

请注意,计算成员不需要返回数字,也可以返回字符串。

在交叉联接(由
*
表示)中使用任何层次结构(无论是用户层次结构还是属性层次结构)在MDX中都是不可能的。一个层次只能出现在一个轴上,并且在轴内的一个位置上。您的第二个语句将把相同的层次结构放在轴的第一行和第二行的位置。您好,Frank,谢谢,是的,我理解,我想问的是,是否有可能以一种可以工作但使用日历层次结构的方式编写顶部查询?谢谢Frank,我不知道+运算符,因此这非常有帮助。结果仍然与我最初的查询略有不同,尽管年和月位于轴上的单个“位置”。因此,尽管第一个查询将包含CY2005 | All Periods,但上面的查询只包含CY2005,然后是下面的第一个月。有什么方法可以在轴上的多个位置上拆分工会吗?@zyme不可能得到与第一个查询完全相同的结果,但是您可以接近,请查看我对答案的编辑。谢谢frank,我感谢您的努力。我猜这可能不可能。我之所以希望在使用adomd.net处理c#中的结果集时将其转换为该格式,并且一致地处理不同层次结构之间的交叉连接和单个层次结构之间的并集将是一件好事。@这是不可能的,因为一个层次结构只能出现在查询中的一个位置。这就是MDX的工作原理。这类似于请求不同的行在SQL结果中包含不同的列:这在SQL中是不可能的。
WITH Member Measures.Year AS
            IIf([Date].[Calendar].CurrentMember.Level IS [Date].[Calendar].[Calendar Year],
                [Date].[Calendar].CurrentMember.Name,
                Ancestor([Date].[Calendar].CurrentMember, [Date].[Calendar].[Calendar Year]).Name
               )
     Member Measures.Month AS
            IIf([Date].[Calendar].CurrentMember.Level IS [Date].[Calendar].[Month],
                [Date].[Calendar].CurrentMember.Name,
                'All Months'
               )
SELECT {
        Measures.Year,
        Measures.Month,
        [Measures].[Internet Sales Amount]
       }
       ON 0,
Hierarchize([Date].[Calendar].[Calendar Year] + [Date].[Calendar].[Month]) ON 1
FROM [Adventure Works]