用于TPC H基准查询3的MDX查询

时间:2014-04-13 17:14:10

标签: mdx

任何人都可以指导我使用MDX查询以下用SQL-92编写的查询

SELECT TOP 10 
     L_ORDERKEY, 
     SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS REVENUE, 
     O_ORDERDATE, O_SHIPPRIORITY
FROM 
     CUSTOMER, ORDERS, LINEITEM
WHERE 
     C_MKTSEGMENT = 'BUILDING' 
 AND C_CUSTKEY = O_CUSTKEY 
 AND L_ORDERKEY = O_ORDERKEY 
 AND O_ORDERDATE < '1995-03-15' 
 AND L_SHIPDATE > '1995-03-15'
GROUP BY 
     L_ORDERKEY, O_ORDERDATE, O_SHIPPRIORITY
ORDER BY 
     REVENUE DESC, O_ORDERDATE

我在MDX中编写了以下查询,但这并没有根据Order_Date带来结果,我将与您分享我的MDX结果

SELECT {(
    TopCount([TPCHQUERY3VIEW].[L ORDERKEY].members, 
             11, [Measures].[REVENUE]),
    TopCount({null:[TPCHQUERY3VIEW 1].[O ORDERDATE].&[1995-03-15T00:00:00]}, 
             11, [Measures].[REVENUE]),
    [TPCHQUERY3VIEW 2].[O SHIPPRIORITY].&[0])}
    ON ROWS, ORDER([Measures].[REVENUE], [Measures].[REVENUE], DESC) ON COLUMNS
FROM
    [TPC-H 1]
WHERE(
    [TPCHQUERY3VIEW 3].[C MKTSEGMENT].&[BUILDING],
    {null:[TPCHQUERY3VIEW 1].[O ORDERDATE].&[1995-03-15T00:00:00]},
    {[TPCHQUERY3VIEW 4].[L SHIPDATE].&[1995-03-15T00:00:00]:null}
)

1 个答案:

答案 0 :(得分:0)

如果您可以使用稍微更改的结果列顺序,则应执行以下操作:

SELECT
    { [Measures].[REVENUE] }
ON COLUMNS,
    TopCount((null : [TPCHQUERY3VIEW].[O ORDERDATE].&[1995-03-15T00:00:00].PrevMember)
             *
             [TPCHQUERY3VIEW].[L ORDERKEY].[L ORDERKEY].Members
             *
             [TPCHQUERY3VIEW].[O SHIPPRIORITY].[O SHIPPRIORITY].Members
             ,
             10,
             [Measures].[REVENUE]),
ON ROWS
FROM
    [TPC-H]
WHERE 
    { [TPCHQUERY3VIEW].[C MKTSEGMENT].&[BUILDING] }
    *
    ([TPCHQUERY3VIEW].[L SHIPDATE].&[1995-03-15T00:00:00].NextMember : null)

由于我没有你的立方体,我不完全确定没有缺少括号等。我不确定为什么你似乎使用TPCHQUERY3VIEW维度的不同实例。我认为没有必要这样做。但另一方面,您似乎不会为客户和订单使用不同的维度。无论如何,如果没有看到你构建的AS立方体结构,这很难讨论。

需要

PrevMemberNextMember来匹配SQL逻辑的<>逻辑,因为MDX使用(在我看来对最终用户来说更自然) <=>=的包容性逻辑。此外,使用订单日期作为TopCount中的第一个层次结构,这应该隐式地用作第二个排序列,因为在收入平局的情况下,将保留集合中元组的自然顺序( MDX sorting is stable)。