2015-02-02 3 views
2
SELECT 
    {[Measures].[Imports - Tons] 
    , [Measures].[Imports - Metric Tonnes] 
    , [Measures].[Import Customs Value] } ON COLUMNS, 
{CROSSJOIN (
    [Date].[Month Year].members 
    ,[Country].[Country Name].members 
    ,[Steel Mill Product].[Steel Mill Product Name].[Plates-Cut Length] 
    ,[Concordance].[HTS 10 Digit Code].members) } 
ON ROWS 
FROM [AISISteel] 
WHERE ([Date].[Year].[2014], [Concordance].[HTS 2 Digit Code].[72]) 

이 MDX 쿼리가 있습니다.
이 데이터를 모두 가져오고 Import-Tons> 0 인 데이터 만 가져오고 싶습니다. 어떻게하면 좋을까요?MDX 쿼리에 필터 추가

답변

5

당신에게 FILTER 기능을 사용해 볼 수 있습니다 다음 CROSSJOIN 기능에 대한 바로 가기가있는 거의 사용되지 HAVING 절은 단지 편의상 또한

SELECT 
    {[Measures].[Imports - Tons] 
    , [Measures].[Imports - Metric Tonnes] 
    , [Measures].[Import Customs Value] } 
ON COLUMNS, 
    {CROSSJOIN (
    [Date].[Month Year].members 
    ,[Country].[Country Name].members 
    ,[Steel Mill Product].[Steel Mill Product Name].[Plates-Cut Length] 
    ,[Concordance].[HTS 10 Digit Code].members) } 
HAVING [Measures].[Imports - Tons] > 0 
ON ROWS 
FROM [AISISteel] 
WHERE ([Date].[Year].[2014], [Concordance].[HTS 2 Digit Code].[72]) 

에 대한 가능한 옵션 또한

SELECT 
    {[Measures].[Imports - Tons] 
    , [Measures].[Imports - Metric Tonnes] 
    , [Measures].[Import Customs Value] } ON COLUMNS, 
FILTER(
    {CROSSJOIN (
    [Date].[Month Year].members 
    ,[Country].[Country Name].members 
    ,[Steel Mill Product].[Steel Mill Product Name].[Plates-Cut Length] 
    ,[Concordance].[HTS 10 Digit Code].members) } 
    , [Measures].[Imports - Tons] > 0 
) 
ON ROWS 
FROM [AISISteel] 
WHERE ([Date].[Year].[2014], [Concordance].[HTS 2 Digit Code].[72]) 

을 거의 항상 선호되는 :

SELECT 
    {[Measures].[Imports - Tons] 
    , [Measures].[Imports - Metric Tonnes] 
    , [Measures].[Import Customs Value] } 
ON COLUMNS, 
    {[Date].[Month Year].members* 
    [Country].[Country Name].members* 
    [Steel Mill Product].[Steel Mill Product Name].[Plates-Cut Length]* 
    [Concordance].[HTS 10 Digit Code].members} 
HAVING [Measures].[Imports - Tons] > 0 
ON ROWS 
FROM [AISISteel] 
WHERE ([Date].[Year].[2014], [Concordance].[HTS 2 Digit Code].[72]) 

편집

515,는 다음에 위의 실행 시간 많은 다른 비교하면?

SELECT 
    {[Measures].[Imports - Tons] 
    , [Measures].[Imports - Metric Tonnes] 
    , [Measures].[Import Customs Value] } ON COLUMNS, 
    FILTER(
    NONEMPTY(
    [Date].[Month Year].members* 
    [Country].[Country Name].members* 
    [Steel Mill Product].[Steel Mill Product Name].[Plates-Cut Length]* 
    [Concordance].[HTS 10 Digit Code].members 
    ,[Measures].[Imports - Tons] 
    ) 
    ,[Measures].[Imports - Tons] > 0 
) 
ON ROWS 
FROM [AISISteel] 
WHERE ([Date].[Year].[2014], [Concordance].[HTS 2 Digit Code].[72]) 
+0

이 예에서는 HAVING의 성능이 훨씬 향상 될 것입니다. –

+0

@DanielHanczyc 제발이 설명을 설명해주세요. 필자는 필터가 일반적으로 성능 측면에서는 좋지 않지만 MDD 튜닝에 대한 지식은 제한적이라는 것을 알고 있습니다. – whytheq

+1

필터는 교차 결합 연산이 수행 된 후 적용됩니다 (컴파일러에서 최적화되지 않음). 반면에 'having'절이 자체 교차 결합 중에 적용됩니다. – George