Reporting services MDX-前N名,按尺寸和尺寸排序
我正在尝试编写一个相当简单(至少是SQL)的MDX查询,但没有成功 一些数据透视: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位)
- 我正在编写一份十大国家报告
- 排名前十的国家将在最近选定的年份(本例中为2016年)确定
- 如果2016年没有国家,我必须从2015年开始进入前10名(仅一年前)
- 如果2016年只有3个国家,那么我必须从2015年起选择7个国家
- 我每年使用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]