NULL データが含まれる場合の MDX 関数 BOTTOMCOUNT 使用の注意事項

 

SQL Server Developer Support チーム

 

概要

 

 

SQL Server Analysis Services のキューブデータには、データソースとなるデータに依存し、メジャーに NULL データを含む場合があります。
MDX 関数に BOTTOMCOUNT という関数があり、これは、指定した項目を並べ替え、下位から指定した件数分のデータを取得するという関数です。

 

この関数を利用した場合に NULL データが含まれていると、並べ替えの結果、NULL が下位となり NULL のデータを優先して返すこととなり、想定しない結果が返ったと感じる場合があります。

 

データ例
弊社 Adventure Works DW サンプルデータベースを基に、BOTTOMCOUNT を利用し、メジャーの Internet Sales Amount が最下位 3 つの [Product].[SubCategory] を返却する方法を案内します。
[Product].[SubCategory] 別の Internet Sales Amount は以下の通り、NULL を含むレコードが含まれています。

 

clip_image001

上記から、NULL でない値を保持する最下位 3 位の [Product].[SubCategory] は次の通り、 Socks, Cleaners, Caps の 3 つです。  clip_image002

次の結果の通り、NULL が最下位 3 つのレコードと認識されるため、NULL のレコードを保持する [Product].[SubCategory] が返されます。

-- 式

SELECT {[Measures].[Internet Sales Amount]} ON COLUMNS,BOTTOMCOUNT([Product].[Subcategory].Members ,3, [Measures].[Internet Sales Amount]) ON ROWSFROM[Adventure Works]

 

-- 結果 clip_image003

対処方法

MDX 関数の BOTTOMCOUNT を利用し、セットを指定した値で昇順に並び替える際、NULL となる値を FILTER する必要があります。

実装例 

NULL を排除するように、FILTER した場合、NULL のレコードを保持する [Product].[SubCategory] は排除されるため、NULL でない値を保持する最下位 3 位の [Product].[SubCategory] である、 Socks, Cleaners, Caps の 3 つが返されます。 

-- 式

SELECT {[Measures].[Internet Sales Amount]} ON COLUMNS,BOTTOMCOUNT(FILTER([Product].[Subcategory].Members, NOT ISEMPTY([Measures].[Internet Sales Amount]))                 ,3                , [Measures].[Internet Sales Amount]) ON ROWS FROM        [Adventure Works]

-- 結果 clip_image004

 

NULL を Filter した結果、NULL を除いた下位データを得ることができます。