MDX пересекает иерархию измерений с детальными измерениями, что приводит к дублированию статистики набора данных служб Reporting Services.
Я построил отчет о доходах SSRS в Visual Studio 2005 через источник данных SSAS 2008 R2 Qube для развертывания на MS SharePoint 2005 Server. Работает нормально (на русском):
(упс, не могу опубликовать изображение ниже 10 баллов репутации)
Но проблема в том, что отчет mdx выводит дублирующуюся статистику x2/x3/x4/x10 в разных показателях, которые загружаются на разные уровни иерархии календаря (некоторые планы имеют годовую гранулярность, другие квартальные фактические данные лежат на конечном уровне точного даты). Вот абстрактный mdx-код:
/* Revenue plan-fact report for business units
(simplified translated abstact,
initially built for new 2015 and old clients) */
/*============================================================================
CALCULATED MEASURES
============================================================================*/
WITH
MEMBER [is new client] AS
CASE
WHEN [Clients].[First contract calendar].CURRENTMEMBER =
[Clients].[First contract calendar].[Year START DATE].&[2015-01-01T00:00:00]
THEN 1 ELSE 0 END
MEMBER [Measures].[New clients - Revenue Plan] AS
CASE WHEN [is new client] = 1
THEN [Measures].[New clients - Revenue Plan]
ELSE null END
MEMBER [Measures].[New clients - Revenue Fact] AS
CASE WHEN [is new client] = 1
THEN [Measures].[New clients - Revenue Fact]
ELSE null END
MEMBER [Measures].[New cients - contracts Plan] AS
CASE WHEN [is new client] = 1
THEN [Measures].[New cients - contracts Plan]
ELSE null END
/*============================================================================
CONSTRACT DATA SET
============================================================================*/
SELECT {[Measures].[New clients - Revenue Plan],
[Measures].[New clients - Revenue Fact],
[Measures].[New cients - contracts Plan]} ON COLUMNS,
--exists(
--nonempty(
CrossJoin(
-- dimention of client's first contract calendar
-- (we need it to calculate measure of new/old client flag):
-- drill down from years through quarters to monthes
Hierarchize(DrilldownMember({
{DrilldownLevel({[Clients].[First contract calendar].[Year START DATE]})}},
{[Clients].[First contract calendar].[Quarter START DATE]})
-{[Clients].[First contract calendar].[Month START DATE].&[1899-12-30T00:00:00]}),
-- dimention of company's business structure (to show in report rows)
Hierarchize(DrilldownMember({
{DrilldownLevel({[Business structure].[Hierarchi].[ALL]})}},
{[Business structure].[Hierarchi].[LV1].&[3]})
-{[Business structure].[Hierarchi].[ALL],
[Business structure].[Hierarchi].[LV1].&[3],
[Business structure].[Hierarchi].[LV2].&[3]})
)
--))
ON ROWS
FROM [DWH_FD_client_count]
что приводит к набору данных с удвоенной статистикой на разных уровнях иерархии календаря:
(упс, не могу опубликовать изображение ниже 10 баллов репутации)
Я пробовал функции существующие (), nonempty(), nonemptycrossjoin() и filter() - но все это приводит к пробелам в статистике для части бизнес-единиц. Я полагаю, что основной проблемой является гранулярность мер Кубе. Но я не могу повлиять на это, мне нужно, чтобы цифры были хорошими на стороне mdx сервера отчетов. Может быть, мне нужно изменить блок детализации для иерархии мер [Клиенты].[Календарь первого контракта].
ПОМОГИТЕ мне, пожалуйста, ребята! Я не могу преодолеть эту проболему уже две недели
2 ответа
Вот решение, которое сработало для меня. Проблема, по-видимому, заключалась в детализации иерархии измерения [Клиенты].[Календарь первого контракта], которая вызвала неправильное пересечение его уровней с выводом избыточных строк и статистикой удвоения. Чтобы заставить работать MDX, я просто заменил этот блок кода:
Hierarchize(DrilldownMember({
{DrilldownLevel({[Clients].[First contract calendar].[Year START DATE]})}},
{[Clients].[First contract calendar].[Quarter START DATE]})
-{[Clients].[First contract calendar].[Month START DATE].&[1899-12-30T00:00:00]})
только с одним вызовом атрибута иерархии:
[Clients].[First contract calendar].[Month START DATE]
Примечание: выходной набор данных в службах Reporting Services создает не только столбец Monthes, но и все его уровни родительской иерархии: годы и кварталы, которые я пытался создать с помощью функций Drilldownmember() и Drilldownlevel() изначально
Может быть, вам нужно обернуть ваши пользовательские меры в Sum
или же Aggregate
, Хотя эти меры должны быть рекурсивными? Вы можете попробовать изменить имена - я только что добавил XX
чтобы дифференцировать их от меры, используемой в определении:
MEMBER [Measures].[New clients - Revenue Plan XX] AS
SUM(
CASE WHEN [is new client] = 1
THEN [Measures].[New clients - Revenue Plan]
ELSE null END
)
MEMBER [Measures].[New clients - Revenue Fact XX] AS
SUM(
CASE WHEN [is new client] = 1
THEN [Measures].[New clients - Revenue Fact]
ELSE null END
)
MEMBER [Measures].[New cients - contracts Plan XX] AS
SUM(
CASE WHEN [is new client] = 1
THEN [Measures].[New cients - contracts Plan]
ELSE null END
)