如何在 Pentaho xml 模式中使用 CalculatedMember(维度,而不是度量)?

Posted

技术标签:

【中文标题】如何在 Pentaho xml 模式中使用 CalculatedMember(维度,而不是度量)?【英文标题】:How can i use CalculatedMember (dimension, not measure) in Pentaho xml schema? 【发布时间】:2015-03-10 20:57:15 【问题描述】:

我有这个MDX 查询:

WITH 
  MEMBER [CLIENT].[WITHOUT CLIENT X] AS 
    '[CLIENT].[All CLIENTs] - [CLIENT].[CLIENT X]' 
SELECT 
  [Measures].[Sales] ON COLUMNS
 ,[STORE].[All STOREs].Children ON ROWS
FROM [Sales]
WHERE 
  CrossJoin
  (
    [YEAR].[2015]
   ,[CLIENT].[WITHOUT CLIENT X]
  );

这个查询返回正确的结果(所有没有[CLIENT].[CLIENT X]的商店销售)。

现在,我想在 Saiku、OpenI、BTable 或 Pivot4J 中使用这个计算成员 ([CLIENT].[WITHOUT CLIENT X]) 作为普通维度或类似的东西。

为此我在 schema.xml 中添加了:

<CalculatedMember name="WITHOUT CLIENT X" 
 formula="([CLIENT].[All CLIENTs] - [CLIENT].[CLIENT X])" hierarchy="CLIENT" parent="CLIENT" visible="true"></CalculatedMember>

如果我跑:

 Select [Measures].[Sales] on COLUMNS,
 [STORE].[All STOREs].Children ON ROWS
 from [Sales]
 WHERE CrossJoin([YEAR].[2015], [CLIENT].[WITHOUT CLIENT X])

返回的结果是正确的,但我看不到这个维度 [CLIENT].[WITHOUT CLIENT X]。

在 Saiku、OpenI 或 Pivot4J 中,我找不到这个维度。 由于 CDA (/api/olap/getCubeStructure),BTable 将此维度设为 MEASURES,结果如下:

 
    "type": "measure",
    "name": "WITHOUT CLIENT X",
    "caption": "WITHOUT CLIENT X]",
    "qualifiedName": "[CLIENT].[CLIENT X]",
    "memberType": "FORMULA"
  

但没用,因为我不能在过滤器中使用。

你有同样的答案吗?

可能的问题:

    为什么你使用成员而不是命名集?

因为维度 CLIENT 它是一个巨大的(超过 50000 个)查询,成员在 1 秒内运行并且在超过 5 分钟内设置

    为什么不使用 EXCEPT?

同 1。

    为什么不只使用 mdx 查询?

因为最终报告是针对非技术人员的,他们想要更改此过滤器。

更新信息

我将 [CLIENT].[WITHOUT_this_CLIENT] 改名为 [CLIENT].[WITHOUT CLIENT X][CLIENT].[My Special Client] 与 *[CLIENT].[CLIENT X]* 避免混淆。

我想以这种方式过滤一个级别:添加除一个 (CLIENT X) 之外的所有成员 (CLIENT)。

当我使用 mdx 查询时返回的结果是正确的,因为 GUI OLAP 客户端无法读取我的 xml 架构。

我不知道我的错误在哪里。

谢谢你, 地理位置

已解决

对于我想要的(从一个大列表中过滤一个元素),答案是这样的:

我创建了另一个维度,仅用于过滤。

    <Dimension type="StandardDimension" visible="true" highCardinality="false" name="CLIENT X">
    <Hierarchy visible="true" hasAll="true">
      <Table name="SALES" schema="SALES" />
      <Level name="CLIENT X" visible="true" column="CLIENT" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        <KeyExpression>
          <SQL dialect="oracle">
            <![CDATA[CASE WHEN CLIENT =  'CLIENT X'  THEN  'CLIENT X' ELSE 'WITHOUT CLIENT X' END]]>
          </SQL>
        </KeyExpression>
      </Level>
    </Hierarchy>
  </Dimension>

【问题讨论】:

the result returned is corect, but i can't see this dimension [CLIENT].[WITHOUT_this_CLIENT] - 你能用输出编辑你的答案,让我们知道你的意思吗?另外,你的实际意图是什么? 【参考方案1】:

您没有正确定义您的成员。 IE。父成员必须是新创建成员的父级的完全限定名称,而不是级别的名称。仔细阅读this,你会明白的。

【讨论】:

我已经读过,但我真的不明白。我有MEMBER [CLIENT].[WITHOUT_this_CLIENT] AS '[CLIENT].[All CLIENTs] - [CLIENT].[My Special Client]',我想在模式中转换:&lt;CalculatedMember name="WITHOUT_this_CLIENT" formula="([CLIENT].[All CLIENTs] - [CLIENT].[My Special Client])" hierarchy="CLIENT" parent="CLIENT" visible="true"&gt;&lt;/CalculatedMember&gt;

以上是关于如何在 Pentaho xml 模式中使用 CalculatedMember(维度,而不是度量)?的主要内容,如果未能解决你的问题,请参考以下文章

XPath 使用从 XML 获取数据 - Pentaho

比较两个表的 xml [PENTAHO]

在没有模式工作台的情况下在 pentaho 5.1 中部署 mondrian 模式

我如何在 pentaho 数据集成中设计星型模式

使用 StAX / Kettle (Pentaho) 读取 XML 文件

如何激活Pentaho CTools功能属性