【问题标题】:Where condition in Mondrian蒙德里安的情况
【发布时间】:2015-08-20 06:27:30
【问题描述】:

MDX查询查找工资超过5000的员工

select 
    {
      [Measures].[Total Employee],
      [Measures].[Total Salary]
    } on columns,
NON EMPTY 
    {
     (
      [Department].[All Department],
      [Position].[All Position],
      [Employee].[All Employee])
    } on rows
from Salary
where 
      [Measures].[Total Salary]>5000

我的架构

<Schema name="Foodmart">
  <Cube name="Salary" visible="true" cache="true" enabled="true">
    <Table name="employee" alias="">
    </Table>
    <Dimension type="StandardDimension" visible="true" foreignKey="department_id" name="Department">
      <Hierarchy name="All Department" visible="true" hasAll="true" allMemberName="All Department" primaryKey="department_id" primaryKeyTable="department">
        <Table name="department">
        </Table>
        <Level name="Dept" visible="true" column="department_description" uniqueMembers="true">
        </Level>
      </Hierarchy>
    </Dimension>
    <Dimension type="StandardDimension" visible="true" foreignKey="position_id" name="Position">
      <Hierarchy name="All Position" visible="false" hasAll="true" allMemberName="All Position" primaryKey="position_id" primaryKeyTable="position">
        <Table name="position">
        </Table>
        <Level name="position" visible="true" table="position" column="position_title" uniqueMembers="false">
        </Level>
      </Hierarchy>
    </Dimension>
    <Dimension type="StandardDimension" visible="true" name="Employee">
      <Hierarchy name="All Employee" visible="true" hasAll="true" allMemberName="All Employee">
        <Table name="employee" alias="">
        </Table>
        <Level name="New Level 0" visible="true" column="full_name" uniqueMembers="false">
        </Level>
      </Hierarchy>
    </Dimension>
    <Measure name="Total Salary" column="salary" aggregator="sum" visible="true">
    </Measure>
    <Measure name="Total Employee" column="employee_id" aggregator="distinct-count" visible="true">
    </Measure>
  </Cube>
</Schema>

【问题讨论】:

  • 请帮助任何人......
  • 即使 sub-select(你称之为 subquery)在 Mondrian 中不起作用,你也有 2 个完全有效的解决方案。有什么问题?

标签: mdx olap mondrian


【解决方案1】:

我知道如果你来自slq,看起来没问题,但以下是错误的:

WHERE
      [Measures].[Total Salary]>5000

您可以在SELECT 子句中使用过滤器功能:

SELECT
    {
      [Measures].[Total Employee],
      [Measures].[Total Salary]
    } ON COLUMNS,
NON EMPTY 
    {
     (
      [Department].[All Department],
      [Position].[All Position]
     )
    } ON ROWS
FROM [Salary]
WHERE FILTER(
        [Employee].[All Employee].CHILDREN,
        [Measures].[Total Salary]>5000
      );

上面将过滤所有时间总工资大于5000的员工。

如果您喜欢以下内容,过滤器可以绕过完整的交叉集,但您将获得返回的所有相应员工的列表:

SELECT
    {
      [Measures].[Total Employee],
      [Measures].[Total Salary]
    } ON COLUMNS,
NON EMPTY 
    FILTER(
     {
      (
       [Department].[All Department],
       [Position].[All Position],
       [Employee].[All Employee].CHILDREN
      )
     }
    ,[Measures].[Total Salary]>5000
   ) ON ROWS
FROM [Salary];

或者在整个集合中使用HAVING 子句——尽管这在逻辑上与上述不同:

SELECT
    {
      [Measures].[Total Employee],
      [Measures].[Total Salary]
    } ON COLUMNS,
NON EMPTY 
       [Department].[All Department]
     * [Position].[All Position],
     * [Employee].[All Employee].CHILDREN
   HAVING [Measures].[Total Salary]>5000 ON ROWS
FROM [Salary];

编辑

如果您仍然需要 ROWS 上的 [All EmplyeeS] 成员,您可以将过滤器移动到子多维数据集:

SELECT
    {
      [Measures].[Total Employee],
      [Measures].[Total Salary]
    } ON COLUMNS,
NON EMPTY 
      [Department].[All Department]
     *[Position].[All Position]
     *[Employee].[All Employee]
    ON ROWS
FROM 
(
SELECT
    FILTER(
        [Employee].[All Employee].CHILDREN,
        [Measures].[Total Salary]>5000
      ) ON 0
FROM [Salary] 
);

【讨论】:

  • 蒙德里安错误:多个函数匹配签名'.MEMBERS';它们是:.Members, .Members 在执行 1 和 2 查询时发生以下错误请帮助我?
  • @devendrasingh 我将编辑我的脚本,因为我稍微误解了您的要求
  • 感谢@whytheq。但它没有在行上显示员工总数。第一次查询
  • 并花费大量时间来加载结果。
  • @devendrasingh 尝试将员工总数添加到行中?它应该抛出一个错误——这是因为我们已经在WHERE 子句中使用了它。有办法解决这个问题 - 我将添加一个编辑。
【解决方案2】:

我猜您遇到了空间/内存问题。如果是这样,你可以试试下面的代码:

select 
    {
      [Measures].[Total Employee],
      [Measures].[Total Salary]
    } on columns,
NON EMPTY 
    {
     NonEmpty(
              (
               [Department].[All Department] *
               [Position].[All Position] *
               [Employee].[All Employee]
              )
              ,[Measures].[Total Salary]
             )
    } having [Measures].[Total Salary] > 5000 on rows
from Salary

NonEmpty 函数将在交叉连接时删除空元组。

编辑 1 现在怎么样?

with member [Measures].SalGrtrThan5000 
as
IIF
  (
   [Measures].[Total Salary] > 5000, 
   1, 
   NULL
  )

select 
    {
      [Measures].[Total Employee],
      [Measures].[Total Salary]
    } on columns,
NON EMPTY 
    {
     NonEmpty(
              (
               [Department].[All Department] *
               [Position].[All Position] *
               [Employee].[All Employee]
              )
              ,[Measures].SalGrtrThan5000 
             )
    } 
      on rows
from Salary

编辑,使用 EXISTS

select 
    {
      [Measures].[Total Employee],
      [Measures].[Total Salary]
    } on columns,
NON EMPTY 
    {
     FILTER
        (
            EXISTS (
                      (
                       [Department].[All Department] *
                       [Position].[All Position] *
                       [Employee].[All Employee]
                      )
              , , "SomeMeasureGroup"
                   ) //EXISTS will remove non-empty tuples this way
        , [Measures].[Total Salary] > 5000
        )//Filters the set
    } 
      on rows
from Salary

将“SomeMeasureGroup”替换为[Measures].[Total Salary] 所属的度量值组的实际名称。有一个逐个单元格的过滤器,但使用EXISTS,希望这次会更快。

【讨论】:

  • Thnaks @Sourav 。但仍然显示 --- Mondrian Error:Syntax error at line 16, column 7, token 'have'
  • 我们不能在层次结构[所有部门]、[所有职位]、[所有员工]中使用“成员”-----显示蒙德里安错误:多个函数匹配签名'.会员';它们是:.Members,.Members-----
  • 好的,然后删除members 并尝试。 .members 适用于 ssas。我以前没有在蒙德里安工作过。
  • 现在显示这个-----Mondrian 错误:没有函数匹配签名'NonEmpty(, )'-----
  • 蒙德里安没有NonEmpty!感谢上帝,我不在蒙德里安工作!! ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多