MDX эквивалент SQL-подзапросов с агрегацией - PullRequest
0 голосов
/ 27 февраля 2009

Я новичок в MDX и пытаюсь решить следующую проблему. Исследовал вычисленные члены, подвыборы, операторы области видимости и т. Д., Но не могу заставить его делать то, что я хочу.

Допустим, я пытаюсь найти MDX-эквивалент следующего SQL-запроса:

SELECT SUM(netMarketValue) net, 
  SUM(CASE WHEN netMarketValue > 0 THEN netMarketValue ELSE 0 END) assets,
  SUM(CASE WHEN netMarketValue < 0 THEN netMarketValue ELSE 0 END) liabilities,
  SUM(ABS(netMarketValue)) gross
  someEntity1
FROM (
SELECT SUM(marketValue) netMarketValue, someEntity1, someEntity2
FROM <some set of tables>
GROUP BY someEntity1, someEntity2) t
GROUP BY someEntity1

Другими словами, у меня есть бухгалтерская книга, в которой я скрываю внутренние взаимозачеты (в пределах someEntity2), а затем вычисляю активы и обязательства после агрегирования их по someEntity2. Затем я хочу увидеть общую сумму этих активов и пассивов, агрегированных более крупной организацией, someEntity1.

В моей схеме MDX я предположительно имел бы куб с измерениями для someEntity1 и someEntity2, а marketValue была бы моей таблицей / мерой фактов. Я полагаю, что мог бы создать еще один DSV, который выполнял бы то же, что и мой подзапрос (вычисление net), и просто создать куб с этим измерением моей меры, но мне интересно, есть ли лучший способ. Я бы предпочел не иметь 2 куба (один для этих сетевых вычислений и другой для перехода на более низкий уровень детализации для других вариантов использования), поскольку в моей базе данных будет много дублирующейся информации. Это будут очень большие кубики.

Ответы [ 2 ]

0 голосов
/ 13 октября 2009

Я думаю, что вам нужны не два куба, а один куб с двумя таблицами фактов (иногда называемый схемой созвездия). Вопрос был написан несколько месяцев назад, поэтому я не буду подробно останавливаться здесь, если кто-то не попросит дополнительную информацию.

0 голосов
/ 27 февраля 2009

Я думаю, что вы должны оставить логику агрегирования для куба - это то, что он делает лучше всего.

В вашем случае я бы создал измерение учетной записи, а затем добавил бы учетную запись . Однако это работает только для корпоративной версии SQL Server (2005 и выше).

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

Именно так мы привыкли делать это с Sql Server 2000, и здесь у вас есть отличный пример.

...