MONDRIAN MDX查询问题

时间:2013-03-04 16:14:17

标签: mdx olap-cube mondrian

我需要从MySQL中的一个表创建一个OLAP视图。

我需要从表格中的以下列中获取信息:

  • loginNote
  • logoutNote
  • 时间戳
  • USERFIRSTNAME

所以我创建了这个Mondrian Schema:

<Schema name="Login">
  <Cube name="Login" visible="true" cache="true" enabled="true">
    <Table name="event_log">
    </Table>
    <Dimension visible="true" highCardinality="false" name="UserFirstName">
        <Hierarchy visible="true" hasAll="true" allMemberName="All UserFirstName">
          <Level name="UserFirstName" visible="true" column="userFirstName" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
          </Level>
        </Hierarchy>
    </Dimension>
<Dimension visible="true" highCardinality="false" name="LoginNote">
        <Hierarchy visible="true" hasAll="true" allMemberName="All LoginNote">
          <Level name="LoginNote" visible="true" column="loginNote" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
          </Level>
        </Hierarchy>
    </Dimension>
<Dimension visible="true" highCardinality="false" name="LogoutNote">
        <Hierarchy visible="true" hasAll="true" allMemberName="All UserFirstName">
          <Level name="LogoutNote" visible="true" column="logoutNote" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
          </Level>
        </Hierarchy>
    </Dimension>
    <Measure name="Users" column="userFirstName" aggregator="count" description="Users">
    </Measure>

我想知道如何运行MDX查询以便能够在行上显示LoginNote和LogoutNote信息,并在列中显示UserFirstName。

我能够跑

Select
UserFirstName.Children ON COLUMNS,
LogoutNote.Children ON ROWS
FROM Login

Select
UserFirstName.Children ON COLUMNS,
LoginNote.Children ON ROWS
FROM Login

但是我无法运行

Select
UserFirstName.Children ON COLUMNS,
{LogoutNote.Children,LoginNote.Children} ON ROWS
FROM Login

因为返回错误:

  

函数“{}”的所有参数必须具有相同的层次结构。

任何帮助将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:3)

{...}表示法是Union(...)的简写,它将两组成员组合在一起。这些成员必须来自相同的层次结构(如错误消息所示),但您包括来自LogoutNote和LoginNote的成员,这些成员是不同的维度/层次结构。

如果要组合层次结构,则需要Crossjoin()它们,创建两个集合的笛卡尔积。

SELECT
    UserFirstName.Children ON COLUMNS,
    Crossjoin(LogoutNote.Children, LoginNote.Children) ON ROWS
FROM Login

我不确定这是否与您的查询结果完全一致,您可能希望在该Crossjoin()之前添加NON EMPTY以消除所有具有LoginNote和LogoutNote的组合没有价值观。

希望能让你走上正轨。