MDX Filter表达式理解
MDX Filter expression understanding
我无法理解 FILTER 函数在 MDX 中的工作原理。
这是我的查询,它获取所有日历年所有销售区域国家/地区的所有非空 Internet 订单计数值。
SELECT
NON EMPTY
{
Filter
(
{[Date].[Calendar].[Calendar Year].MEMBERS}
,
[Measures].[Internet Order Count] > 0
)
} ON COLUMNS
,[Sales Territory].[Sales Territory].[Country].MEMBERS
ON ROWS
FROM [Adventure Works]
WHERE
[Measures].[Internet Order Count];
这给了我所有的订单,因为我按 0 过滤,结果如下所示
CY 2010,CY 2011,CY 2012,CY 2013,CY 2014
France, 1 ,140 ,359 ,"1,917",67
Germany, ,175 ,339 ,"1,909",61
United Kingdom ,1 ,175 ,405 ,"2,377",73
Canada, 1 ,170 ,169 ,"2,856",179
United States, 5 ,770 ,867 ,"7,590",335
Australia, 6 ,786 ,"1,130","4,640",156
我正在以 csv 格式输入结果,因为目前上传图片有限制。我是 MDX 的新手,我的目标是过滤 Internet 订单计数大于 180 的结果集。
因此我现在将查询修改为 -
SELECT
NON EMPTY
{
Filter
(
{[Date].[Calendar].[Calendar Year].MEMBERS}
,
[Measures].[Internet Order Count] > 180
)
} ON COLUMNS
,[Sales Territory].[Sales Territory].[Country].MEMBERS
ON ROWS
FROM [Adventure Works]
WHERE
[Measures].[Internet Order Count];
这个给了我下面的输出 -
CY 2011,CY 2012,CY 2013,CY 2014
France, 140 ,359 ,"1,917",67
Germany, 175 ,339 ,"1,909",61
United Kingdom ,175 ,405 ,"2,377",73
Canada, 170 ,169 ,"2,856",179
United States, 770 ,867 ,"7,590",335
Australia, 786 ,"1,130","4,640",156
基本上 CY 2010 条目被过滤掉,而我期望的是没有 entry/blank 值 (France, CY 2011),(Germany, CY 2011),(UK, CY 2011), (加拿大,CY 2011) 等等,当然对于属于 CY 2014 的一些条目也有类似的结果。
我正在使用 AdventureWorksDW2014 多维数据集。我该怎么做?
您只过滤 Internet 订单计数超过 180 的年份,而不是国家/地区维度。试试这个:
SELECT
NON EMPTY [Date].[Calendar].[Calendar Year].MEMBERS ON COLUMNS,
[Sales Territory].[Sales Territory].[Country].MEMBERS ON ROWS
FROM (
SELECT
Filter (
(
[Date].[Calendar].[Calendar Year].MEMBERS ,
[Sales Territory].[Sales Territory].[Country].MEMBERS
),
[Measures].[Internet Order Count] > 180
) ON 0
FROM [Adventure Works]
)
WHERE
[Measures].[Internet Order Count]
您的第一个脚本实际上就是以下内容。不需要任何过滤器,因为它是一个计数,所以 <0 永远不会发生:
SELECT
NON EMPTY
[Date].[Calendar].[Calendar Year].MEMBERS ON 0
,[Sales Territory].[Sales Territory].[Country].MEMBERS ON 1
FROM [Adventure Works]
WHERE
[Measures].[Internet Order Count];
在我的旧版本 AdvWrks
中,结果如下:
AI居然认为你更在以下:
WITH
MEMBER [Measures].[transformToNull] AS
IIF
(
[Measures].[Internet Order Count] <= 180
,null
,[Measures].[Internet Order Count]
)
SELECT
NON EMPTY
{[Date].[Calendar].[Calendar Year].MEMBERS} ON COLUMNS
,[Sales Territory].[Sales Territory].[Country].MEMBERS ON ROWS
FROM [Adventure Works]
WHERE
[Measures].[transformToNull];
结果如下:
我无法理解 FILTER 函数在 MDX 中的工作原理。
这是我的查询,它获取所有日历年所有销售区域国家/地区的所有非空 Internet 订单计数值。
SELECT
NON EMPTY
{
Filter
(
{[Date].[Calendar].[Calendar Year].MEMBERS}
,
[Measures].[Internet Order Count] > 0
)
} ON COLUMNS
,[Sales Territory].[Sales Territory].[Country].MEMBERS
ON ROWS
FROM [Adventure Works]
WHERE
[Measures].[Internet Order Count];
这给了我所有的订单,因为我按 0 过滤,结果如下所示
CY 2010,CY 2011,CY 2012,CY 2013,CY 2014
France, 1 ,140 ,359 ,"1,917",67
Germany, ,175 ,339 ,"1,909",61
United Kingdom ,1 ,175 ,405 ,"2,377",73
Canada, 1 ,170 ,169 ,"2,856",179
United States, 5 ,770 ,867 ,"7,590",335
Australia, 6 ,786 ,"1,130","4,640",156
我正在以 csv 格式输入结果,因为目前上传图片有限制。我是 MDX 的新手,我的目标是过滤 Internet 订单计数大于 180 的结果集。
因此我现在将查询修改为 -
SELECT
NON EMPTY
{
Filter
(
{[Date].[Calendar].[Calendar Year].MEMBERS}
,
[Measures].[Internet Order Count] > 180
)
} ON COLUMNS
,[Sales Territory].[Sales Territory].[Country].MEMBERS
ON ROWS
FROM [Adventure Works]
WHERE
[Measures].[Internet Order Count];
这个给了我下面的输出 -
CY 2011,CY 2012,CY 2013,CY 2014
France, 140 ,359 ,"1,917",67
Germany, 175 ,339 ,"1,909",61
United Kingdom ,175 ,405 ,"2,377",73
Canada, 170 ,169 ,"2,856",179
United States, 770 ,867 ,"7,590",335
Australia, 786 ,"1,130","4,640",156
基本上 CY 2010 条目被过滤掉,而我期望的是没有 entry/blank 值 (France, CY 2011),(Germany, CY 2011),(UK, CY 2011), (加拿大,CY 2011) 等等,当然对于属于 CY 2014 的一些条目也有类似的结果。
我正在使用 AdventureWorksDW2014 多维数据集。我该怎么做?
您只过滤 Internet 订单计数超过 180 的年份,而不是国家/地区维度。试试这个:
SELECT
NON EMPTY [Date].[Calendar].[Calendar Year].MEMBERS ON COLUMNS,
[Sales Territory].[Sales Territory].[Country].MEMBERS ON ROWS
FROM (
SELECT
Filter (
(
[Date].[Calendar].[Calendar Year].MEMBERS ,
[Sales Territory].[Sales Territory].[Country].MEMBERS
),
[Measures].[Internet Order Count] > 180
) ON 0
FROM [Adventure Works]
)
WHERE
[Measures].[Internet Order Count]
您的第一个脚本实际上就是以下内容。不需要任何过滤器,因为它是一个计数,所以 <0 永远不会发生:
SELECT
NON EMPTY
[Date].[Calendar].[Calendar Year].MEMBERS ON 0
,[Sales Territory].[Sales Territory].[Country].MEMBERS ON 1
FROM [Adventure Works]
WHERE
[Measures].[Internet Order Count];
在我的旧版本 AdvWrks
中,结果如下:
AI居然认为你更在以下:
WITH
MEMBER [Measures].[transformToNull] AS
IIF
(
[Measures].[Internet Order Count] <= 180
,null
,[Measures].[Internet Order Count]
)
SELECT
NON EMPTY
{[Date].[Calendar].[Calendar Year].MEMBERS} ON COLUMNS
,[Sales Territory].[Sales Territory].[Country].MEMBERS ON ROWS
FROM [Adventure Works]
WHERE
[Measures].[transformToNull];
结果如下: