MDX - 前N个,按维度和度量排序

时间:2017-02-27 14:42:19

标签: reporting-services ssas mdx

我正在尝试编写一个相当简单(至少在SQL中)的MDX查询,但没有成功。

一些数据见解:

  • 我正在制作一份十大国家报告
  • 排名前10位的国家/地区受最近选定年份(在本例中为2016年)的约束
  • 如果2016年没有国家,我必须从2015年开始排名前十(仅一年前)
  • 如果2016年只有3个国家,我必须从2015年开始7个

报告在SQL中运行正常,但我似乎无法在MDX中做同样的事情。

我能做什么(但不确定它是否正确):

  • 我使用生成声明
  • 每年将前10个国家/地区(一项措施的前10名)列入其中
  • 我按年份维度订购(我每年有10个国家/地区,按年份DESC排序)

当前脚本

 SELECT 
    NON EMPTY
    { 
        [Measures].[MeasureX]
    } ON COLUMNS, 

    NON EMPTY
    {
        Generate
        (
            ORDER
            (
                [Date].[Year].[Year].ALLMEMBERS,
                [Date].[Year].CurrentMember.Properties("Member_Value"), 
                DESC
            ),
            { [Date].[Year].CurrentMember } *
            TOPCOUNT
                (
                    [Person].[Country].[Country].MEMBERS, 
                    10, 
                    [Measures].[MeasureX]
                )
        )
    } ON ROWS 
 FROM 
    [Cube]

这几乎是我所需要的(但同样 - 可能不是最好的方式)。我现在得到N行数据,就像这样(为了论证,我写的就像我想把它限制在5行一样):

Argentina 1000 2016
Bulgaria 500 2016
USA 444 2016
Germany 8000 2015
Canada 4000 2015
Netherlands 2000 2015

当我把一个HEAD(限制为5)放在我的mdx上时,我得到了一个时髦的结果:

Argentina 1000 2016
Bulgaria 500 2016
USA 444 2016
Germany null 2016
Canada null 2016

我错过了什么。什么是正确的方法?

编辑2017-02-28:

我试图在OLAP中实现这一目标:

;WITH CTE_Subset AS
(
SELECT TOP 50
    YEAR(fis.OrderDate) AS Year,
    SUM(fis.SalesAmount) AS SalesAmount,
    dg.CountryRegionCode
FROM
    dbo.FactInternetSales fis
INNER JOIN
    dbo.DimCustomer dc ON dc.CustomerKey = fis.CustomerKey
INNER JOIN
    dbo.DimGeography dg ON dg.GeographyKey = dc.GeographyKey
GROUP BY
    YEAR(fis.OrderDate),
    dg.CountryRegionCode
ORDER BY
    YEAR(fis.OrderDate) DESC, 
    SUM(fis.SalesAmount) DESC
)
SELECT DISTINCT TOP 10
    CountryRegionCode 
FROM 
    CTE_SubSet 

2 个答案:

答案 0 :(得分:0)

使用不AdvWrks的{​​{1}},我们可以执行以下操作:

GENERATE

导致以下内容符合您的要求?

enter image description here

我们可以使用一个子选择来获得50个 - 在AdvWrks中,50个中只有4个不同的国家:

WITH 
  SET [countryYear] AS 
    Order
    (
      NonEmpty
      (
          [Customer].[Customer Geography].[Country]
        * 
          [Date].[Calendar].[Calendar Year]
       ,[Measures].[Internet Sales Amount]
      )
     ,[Measures].[Internet Sales Amount]
     ,bdesc
    ) 
SELECT 
  [Measures].[Internet Sales Amount] ON 0
 ,Head
  (
    [countryYear]
   ,10
  ) ON 1
FROM [Adventure Works];

结果:

enter image description here

答案 1 :(得分:0)

我没有尝试下面的代码,但您可以重复使用这个想法:使用特殊度量生成每个国家/地区的年份值和最后的MeasureX(即: 2016 0000 <强> 1000 )。但是,如果你有很大的MeasureX值,那么100000000000可能还不够。

@Override
public void onResume() {
    super.onResume();
    // only contains a PreferenceScreen
    addPreferencesFromResource(R.xml.my_settings); 
    mIntentFilter = new IntentFilter("android.intent.action.MYTEST");
    getActivity().registerReceiver(mReceiver, mIntentFilter);

    // request focus on the listview
    getListView().requestFocus();
}