Мне нужно отфильтровать этот набор результатов MDX - PullRequest
2 голосов
/ 19 апреля 2019

Я хочу отфильтровать приведенный ниже набор результатов так, чтобы я показывал результаты только в том случае, если для параметра «Измерение А» значение 1 равно 1, независимо от значения счетчика для параметра «Измерение А». Значение 2

           Dimension A Value 1     Dimension A Value 2
Entity ID   Count                Count
11              1   
78          1   
90          1   
101         1   
114                                1
118         1   
125         1   
134                                    1
140         1   
161         1   
169         1   
186         1                  2

отфильтрованный набор будет выглядеть так:

    Dimension A Value 1 Dimension A Value 2
Entity ID   Count               Count
11           1  
78           1  
90           1  
101          1  
118          1  
125          1  
140          1  
161          1  
169          1  
186          1                 2

MDX равен

WITH
SET [~COLUMNS] AS
    {[Dimension A].[Dimension A].[Value 1], [Dimension A].[Dimension A].[Value 2]}
SET [~ROWS] AS
    {[Entity].[Entity].[Entity ID].Members}
SELECT
NON EMPTY CrossJoin([~COLUMNS], {[Measures].[Count]}) ON COLUMNS,
NON EMPTY [~ROWS] ON ROWS
FROM [My Cube]

Я играл с Filter и NonEmpty, но я новичок в MDX, и мой sql мозг болит.Я предполагаю, что это, вероятно, тривиально для кого-то с большим количеством MDX за поясом, но я терплю неудачу.Будьте нежны, это мой первый вопрос

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Вы можете попробовать предложение HAVING:

WITH
SET [~COLUMNS] AS
    {
      [Dimension A].[Dimension A].[Value 1], 
      [Dimension A].[Dimension A].[Value 2]
    } 
MEMBER [Measures].[CountValue1] AS   //<<<<this is new <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    (
       [Measures].[Count],
       [Dimension A].[Dimension A].[Value 1]
    )
SELECT
NON EMPTY 
  CrossJoin(
    [~COLUMNS]
  , {[Measures].[Count]}
  ) ON COLUMNS,
NON EMPTY 
  [Entity].[Entity].[Entity ID].MEMBERS 
  HAVING [Measures].[CountValue1] = 1    //<<CHANGED TO NEW MEASURE
  ON ROWS
FROM [My Cube];

Если вы можете использовать HAVING вместо FILTER, вы, вероятно, увидите улучшение производительности, особенно если ваши скрипты станут более сложными:
https://blog.crossjoin.co.uk/2006/01/04/the-having-clause/

Просто для завершения медленная FILTER версия будет выглядеть так:

WITH
SET [~COLUMNS] AS
    {
      [Dimension A].[Dimension A].[Value 1], 
      [Dimension A].[Dimension A].[Value 2]
    } 
//>>>>>> following is new >>>>>>>>>>>>>>>>>>>>>
MEMBER [Measures].[CountValueNEW] AS   
    (
       [Measures].[Count],
       [Dimension A].[Dimension A].[Value 1]
    )
SELECT
NON EMPTY 
    [~COLUMNS]
   *{[Measures].[Count]}
ON 0,
NON EMPTY 
FILTER(
  [Entity].[Entity].[Entity ID].MEMBERS,
  [Measures].[CountValueNEW] = 1 
)  
ON 1
FROM [My Cube];
0 голосов
/ 19 апреля 2019

Ваш запрос должен быть похож на

Select ([Dimension A].[AttributeHierarchy1].[AttributeHierarchy1],{[Measures].[Value1],[Measures].[Value2]}) on columns,

filter([Dimension B].[EntityID].[EntityID],[Measures].[Value1]=0)
on rows 
from yourcube

Однако может быть проблема.Например, у вашего dimesnion есть два значения A и B, для конкретной строки, A, value1 = 1, но B, Value1 = 0, эта строка будет отображаться как A, qulizes для него, и B переносится.

Редактировать

Давайте рассмотрим пример. Я хочу увидеть продажи через Интернет для бутылок и клеток, продажи которых превышают 150 $

Мой начальный запрос

select 
([Product].[Subcategory].[Subcategory],[Measures].[Internet Sales Amount]
)
on columns,
[Customer].[City].[City]
on rows 
from 
[Adventure Works]

Результат enter image description here

Теперь измените запрос

select 
([Product].[Subcategory].[Subcategory],[Measures].[Internet Sales Amount]
)
on columns,

filter
(
[Customer].[City].[City], [Measures].[Internet Sales Amount]>150
)
on rows 
from 
(select [Product].[Subcategory].&[28] on 0 from [Adventure Works])

Результат enter image description here

...