我正在尝试编写一个相当简单(至少在SQL中)的MDX查询,但没有成功。
一些数据见解:
报告在SQL中运行正常,但我似乎无法在MDX中做同样的事情。
我能做什么(但不确定它是否正确):
当前脚本
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
答案 0 :(得分:0)
使用不AdvWrks
的{{1}},我们可以执行以下操作:
GENERATE
导致以下内容符合您的要求?
我们可以使用一个子选择来获得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];
结果:
答案 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();
}