2016-09-13 2 views
1

У меня есть таблица базы данных, называемая «tableOne». Стол связан с кубом.Как преобразовать SQL-запрос с подзапросами в запрос MDX?

Следующая SQL запрос на выборку

select row_id, row_group_id, col_group_id, measure_col from tableOne where 
(row_group_id in (select row_group_id from tableOne a where row_id in ('R0020', 'R0030') and col_id = 'C0050') 
or col_group_id in (select col_group_id from tableOne a where row_id in ('R0020', 'R0030') and col_id ='C0050')); 

должен быть преобразован в запрос MDX.

Обратите внимание:

  • Колонки ROW_ID, col_id, row_group_id и col_group_id являются размеры.
  • Столбец measure_col является мерой.

Я использую Mondrian, и я не знаю, как преобразовать подзадачу в запрос MDX.

EDIT:

Это то, что я до сих пор:

SELECT 
{ 
[Measures].[measure_col] 
} 
ON COLUMNS, 
non empty(
CrossJoin([ROW].[ROW].Members 
,CrossJoin([COL_GROUP].[COL_GROUP].Members 
,[ROW_GROUP].[ROW_GROUP].Members 
))) 
ON ROWS 
FROM [tableOne] 
WHERE (
[COL].[COL].[C0050] 
) 

Не могу сказать вам что-нибудь еще о кубе, кроме того, что я уже говорил вам.

+0

Если кто-то отметил вопрос C# и вставил Java, и сказал: «Мне нужен этот Java-код на C#», они будут массово проголосовать. У вас есть какой-нибудь mdx, который вы пробовали? Можете ли вы показать нам, более подробно, размеры вашего куба? – whytheq

+0

Привет, обновленный вопрос. – ScarOnTheSky

ответ

0

Во-первых, возможно, я предлагаю вам переписать SQL на что-то вроде этого:

select row_id, row_group_id, col_group_id, measure_col 
from tableOne a 
where 
    exists(
     select * 
     from tableOne b 
     where 
      row_id in ('R0020', 'R0030') and 
      col_id = 'C0050' and 
      (
       a.row_group_id = b.row_group_id OR 
       a.col_group_id = b.col_group_id 
      ) 
) 

Он должен удалить один скан из вашего плана. Теперь часть MDX.

Если это то, что вы хотите использовать в расчетной мере, было бы лучше, если вы сделаете это в SQL.

Не уверен, что этот MDX вернет требуемый результат.

WITH 
SET mySet 
AS 
NONEMPTY (
    (
     [COL_GROUP].[COL_GROUP].Members, 
     [ROW_GROUP].[ROW_GROUP].Members 
    ), 
    (
     {[ROW].[ROW].[R0020],[ROW].[ROW].[R0030]}, 
     [COL].[COL].[C0050], 
     [Measures].[measure_col] 
    ) 

) 
SELECT 
    { 
    [Measures].[measure_col] 
    } 
    ON COLUMNS, 
    NON EMPTY 
    CROSSJOIN(
     [ROW].[ROW].MEMBERS, 
     mySet 
    ) 
    ON ROWS 
FROM [tableOne] 

mySet должен дать вам все комбинации COL_GROUP и ROW_GROUP, которые имеют значение для ROW r0020 и r0030 и COL C0050.

Смежные вопросы