Reporting services MDX-前N名,按尺寸和尺寸排序

Reporting services MDX-前N名,按尺寸和尺寸排序,reporting-services,ssas,mdx,Reporting Services,Ssas,Mdx,我正在尝试编写一个相当简单(至少是SQL)的MDX查询,但没有成功 一些数据透视: 我正在编写一份十大国家报告 排名前十的国家将在最近选定的年份(本例中为2016年)确定 如果2016年没有国家,我必须从2015年开始进入前10名(仅一年前) 如果2016年只有3个国家,那么我必须从2015年起选择7个国家 该报告在SQL中运行正常,但在MDX中似乎无法实现同样的效果 我能做什么(但不确定是否正确): 我每年使用generate statement统计前10个国家(一项指标排名前10位)

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

一些数据透视:

  • 我正在编写一份十大国家报告
  • 排名前十的国家将在最近选定的年份(本例中为2016年)确定
  • 如果2016年没有国家,我必须从2015年开始进入前10名(仅一年前)
  • 如果2016年只有3个国家,那么我必须从2015年起选择7个国家
该报告在SQL中运行正常,但在MDX中似乎无法实现同样的效果

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

  • 我每年使用generate statement统计前10个国家(一项指标排名前10位)
  • 我按年份维度排序(我每年得到10个国家,按年份描述排序)
当前脚本

 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行):

当我在mdx上放置一个头部(限制为5)时,我得到了一个奇怪的结果:

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 

使用
AdvWrks
而不使用
GENERATE
我们可以执行以下操作:

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];
它会产生以下类似于您的要求的结果

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

SELECT 
  {} ON 0
 ,[Customer].[Customer Geography].[Country] ON 1
FROM 
(
  SELECT 
    Head
    (
      Order
      (
        NonEmpty
        (
            [Customer].[Customer Geography].[Country]
          * 
            [Date].[Calendar].[Calendar Year]
         ,[Measures].[Internet Sales Amount]
        )
       ,[Measures].[Internet Sales Amount]
       ,bdesc
      )
     ,50
    ) ON 0
  FROM [Adventure Works]
);
结果:


我没有尝试下面的代码,但您可以重复使用这个想法:使用一个特殊的度量值生成每个国家,在开始时使用年值,在结束时使用度量值(即:201600001000)。但是,如果您有巨大的MeasureX值,10000000000可能还不够

With
Member [Measures].[MeasureY] as
IIF(
    IsEmpty([Measures].[MeasureX]),
    Null,
    [Date].[Year].CurrentMember.Properties("Member_Value") * 100000000000 + [Measures].[MeasureX]
)

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

    NON EMPTY
    {
    TopCount(
        Generate(
            [Person].[Country].[Country].Members,
            TopCount(
                [Date].[Year].[Year].Members, 
                1, 
                [Measures].[MeasureY]
            )
        ),
        10,
        [Measures].[MeasureY]       
    )
    } ON ROWS 
 FROM 
    [Cube]

您只是想知道如何使用HEAD限制您编写的脚本的结果?或者你想让脚本做得更多?很抱歉,但这不是我想要实现的。你能看一下我问题的编辑部分吗?@user3652540在sql中,这个短语中是否首先应用了DISTINCT或TOP…
选择DISTINCT TOP 10…
首先是DISTINCT(因此你得到所有不同的国家,按照子集的顺序-按年份和度量),然后从这个不同的值中,你得到前10个
With
Member [Measures].[MeasureY] as
IIF(
    IsEmpty([Measures].[MeasureX]),
    Null,
    [Date].[Year].CurrentMember.Properties("Member_Value") * 100000000000 + [Measures].[MeasureX]
)

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

    NON EMPTY
    {
    TopCount(
        Generate(
            [Person].[Country].[Country].Members,
            TopCount(
                [Date].[Year].[Year].Members, 
                1, 
                [Measures].[MeasureY]
            )
        ),
        10,
        [Measures].[MeasureY]       
    )
    } ON ROWS 
 FROM 
    [Cube]