sql-server - MDX - 检索当前在 where 子句中使用的成员级别

标签 sql-server ssas mdx ssas-2008 data-cube

我有一个定义了组织结构层次结构的简单数据立方体。在多维数据集内的计算中,我希望根据当前在 MDX 查询的 WHERE 子句中使用的组织项目级别进行不同的计算。

假设我有 5 个级别的组织结构,对于最后一个级别(商店级别),我想更改使用表达式进行计算的方式:

IIF([组织结构].[父 ID].LEVEL IS [Organization Structure].[Parent Id].[Level 05], 'THIS IS STORE', 'THIS IS NOT')

expression from datacube

这在 Visual Studio 浏览器中产生了我们真正想要的东西: results from browser

和使用 MDX 查询一样:

SELECT { [Measures].[TEST] } ON COLUMNS
FROM [DataCubeName]
WHERE
{
[Organization Structure].[Parent Id].&[123]
}

当我们想在WHERE 子句中使用多个组织结构项时,问题就出现了。此子句中只允许有来自同一级别的项目,我仍然想知道它是哪个级别,但是当然当我们将第二个项目添加到 WHERE 时,如下所示:

SELECT { [Measures].[TEST] } ON COLUMNS
FROM [DataCubeName]
WHERE
{
[Organization Structure].[Parent Id].&[123],
[Organization Structure].[Parent Id].&[124]
}

我收到错误消息“currentmember failed because the coordinate for the attribute contains a set”。

这就是为什么在我的表达中我尝试在许多不同的配置中使用 ITEM(0) 函数,但我就是找不到一种方法来将它用于当前在 WHERE< 中使用的一组项目上/em> 子句...所以最大的问题是:

如何获取当前正在执行的 WHERE 子句中列出的一组项目,以便我可以在该组上使用 Item(0),或者是否有任何其他方法来检索当前选定项目的级别知道他们一定是同一级别的吗?

最佳答案

where 子句中使用 Currentmemberset 可能存在问题。

请参阅 chris Webb 的这篇文章:http://blog.crossjoin.co.uk/2009/08/08/sets-in-the-where-clause-and-autoexists/

针对您的情况,有一个可能的解决方法:您可以尝试根据自己的情况进行调整。

WITH 
  MEMBER [Measures].[x] AS 
    IIF
    (
       (existing [Geography].[Geography].[State-Province].members).item(0).Level
      IS 
       [Geography].[Geography].[State-Province]
     ,'THIS IS state'
     ,'THIS IS NOT'
    ) 
SELECT 
  {[Measures].[x]} ON COLUMNS
FROM [Adventure Works]
WHERE
(
{[Geography].[Geography].[State-Province].&[77]&[FR],
[Geography].[Geography].[State-Province].&[59]&[FR]}
);

扩展上面的内容以证明它有效:

WITH 
  MEMBER [Measures].[x] AS 
    IIF
    (
        (EXISTING 
          [Geography].[Geography].[State-Province].MEMBERS).Item(0).Level
      IS 
        [Geography].[Geography].[State-Province]
     ,'THIS IS state'
     ,'THIS IS NOT'
    ) 
  MEMBER [Measures].[proof] AS 
    (EXISTING 
      [Geography].[Geography].[State-Province].MEMBERS).Item(0).Member_Caption 
  MEMBER [Measures].[proof2] AS 
    (EXISTING 
      [Geography].[Geography].[State-Province].MEMBERS).Count 
SELECT 
  {
    [Measures].[x]
   ,[Measures].[proof]
   ,[Measures].[proof2]
  } ON COLUMNS
FROM [Adventure Works]
WHERE 
  {
    [Geography].[Geography].[State-Province].&[77]&[FR]
   ,[Geography].[Geography].[State-Province].&[59]&[FR]
  };

结果如下:

enter image description here

所以你的表情可能会变成下面这样:

IIF
(
    (EXISTING 
      [Organization Structure].[Parent Id].MEMBERS).Item(0).Level
  IS 
    [Organization Structure].[Parent Id].[Level 05]
 ,'THIS IS STORE'
 ,'THIS IS NOT'
)

关于sql-server - MDX - 检索当前在 where 子句中使用的成员级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30478394/

相关文章:

sql-server - 如何将 2 列求和为 1 列 SQL Server

ssas - 如何抑制 MDX 查询中的单个单元格值?

sql-server - 您能否扩展 SQL Server 以处理 100 TB 的数据?

sql-server - T-SQL : How Do I Create A "Private" Function Inside A Stored Procedure

ssas - 是否可以在 SSAS 表格模型中隐藏属性层次结构的(全部)级别

sql-server - 查询过去 5 个月内天数的日期维度

ssas - Mdx Sum 返回非整数值

java - 从 Java 访问 MS Analysis Services 多维数据集的最佳方式

sql-server - 如何在两列 SQL Server 上应用唯一约束?

c# - 如何使用 C# 在 SSAS 中测试与数据源的连接