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 を含むレコードが含まれています。
上記から、NULL でない値を保持する最下位 3 位の [Product].[SubCategory] は次の通り、 Socks, Cleaners, Caps の 3 つです。
次の結果の通り、NULL が最下位 3 つのレコードと認識されるため、NULL のレコードを保持する [Product].[SubCategory] が返されます。
-- 式
SELECT {[Measures].[Internet Sales Amount]} ON COLUMNS, BOTTOMCOUNT( [Product].[Subcategory].Members ,3 , [Measures].[Internet Sales Amount] ) ON ROWS FROM [Adventure Works] |
-- 結果
対処方法
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] |
-- 結果
NULL を Filter した結果、NULL を除いた下位データを得ることができます。