Получить отчетливое количество пользователей за определенное время MDX QUERY

Мне нужна помощь mdx.

Сведения о кубе:

Measures.Users -> Отдельный счетчик пользователей.

Я хочу найти эквивалент mdx этого запроса:

Select a.shopId ,   Month(TransactionDate) Month_Transaction, 
Year(TransactionDate) Year_Transaction,
count(distinct b.UserID) UniqueUserCount

FROM [dbo].[shop] a
JOIN users b ON a.UserID = b.UserID
where TransactionDate >= '2018-01-01' 
Group by  a.shopId ,Month(TransactionDate), Year(TransactionDate)

Это то, что у меня есть до сих пор, которое производит уникальный счет независимо от даты. Я хочу уникальный счет в диапазоне дат. Пожалуйста, дайте мне знать, как этого добиться?

SELECT { 
[Date].[Month].&[2020]&[2020-Q3]&[2020-09],
[Date].[Month].&[2020]&[2020-Q4]&[2020-10],
[Date].[Month].&[2020]&[2020-Q4]&[2020-11], 
[Date].[Month].&[2020]&[2020-Q4]&[2020-12]
} ON COLUMNS, NON EMPTY 
{ 
    [ShopLocations].[Hierarchy].[Shop] 
} ON ROWS 

FROM [ShopperCube] 
where (Measures.Users)

person DevHelp    schedule 20.02.2021    source источник
comment
Встроенная мера подсчета различных объектов обеспечивает наибольшую гибкость. Похоже, у вас уже есть один как Measure.Users? Связана ли группа мер для пользователей с вашими измерениями для Date и ShopLocations?   -  person Mike Honey    schedule 23.02.2021
comment
Есть ли способ сделать это с помощью вычисляемого столбца? Я думаю, что группа измерения пользователей не связана с датой.   -  person DevHelp    schedule 23.02.2021
comment
Вероятно, это может быть связано. Я бы применил шаблон Distinct Count в документе Many-to-Many Revolution для решения без кода, которое является более гибким и, вероятно, более быстрым в работе: sqlbi.com/whitepapers/many2many   -  person Mike Honey    schedule 24.02.2021
comment
@MikeHoney Ваш первоначальный комментарий помог мне решить проблему. Спасибо.   -  person DevHelp    schedule 24.02.2021
comment
Не беспокойтесь - опубликовано как ответ, для моего дофаминового удара.   -  person Mike Honey    schedule 25.02.2021


Ответы (2)


Встроенная мера подсчета различных объектов обеспечивает наибольшую гибкость. Похоже, у вас уже есть один как Measure.Users? Связана ли группа мер для пользователей с вашими измерениями для Date и ShopLocations?

Чтобы помочь в этом, я бы рассмотрел шаблон Distinct Count в статье Many-to-Many Revolution. Этот подход дает решение без кода, которое является более гибким и, вероятно, более быстрым для запуска:

https://sqlbi.com/whitepapers/many2many

person Mike Honey    schedule 25.02.2021

Вы можете использовать DistinctCount Функция многомерных выражений.

Официальная документация не очень ясна, но общий принцип таков: вы передаете Set этой функции, чтобы получить различные значения.

Образец многомерных выражений

WITH SET MySet AS
    { [Dim User].[User Id].Children } 
 
MEMBER Measures.SetDistinctCount AS
    DISTINCTCOUNT(MySet)

SELECT { Measures.SetDistinctCount, Measures.Amount }  ON 0
       , { [Dim Date].[Date Key].AllMembers } ON 1
FROM [Mine]

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

введите здесь описание изображения

Результат запроса

введите здесь описание изображения

Кроме того, с учетом примера sql для создания таблицы и работы с разными данными:

IF OBJECT_ID('FactTransaction') IS NOT NULL
    DROP TABLE FactTransaction
GO

CREATE TABLE FactTransaction (ShopId INT, TransactionDateKey INT, UserId INT, Amount INT)
GO

IF OBJECT_ID('DimDate') IS NOT NULL
    DROP TABLE DimDate
GO
CREATE TABLE DimDate(DateKey INT, FullDate DATE)
GO

IF OBJECT_ID('DimUser') IS NOT NULL
    DROP TABLE DimUser
GO
CREATE TABLE DimUser(UserId INT, UserName VARCHAR(50))
GO

IF OBJECT_ID('DimShop') IS NOT NULL
    DROP TABLE DimShop
GO
CREATE TABLE DimShop(ShopId INT, ShopName VARCHAR(50))
GO

--Shop 1
INSERT INTO FactTransaction values(1, 20210101, 1, 10)
INSERT INTO FactTransaction values(1, 20210101, 2, 5)
INSERT INTO FactTransaction values(1, 20210101, 3, 20)

INSERT INTO FactTransaction values(1, 20210102, 2, 10)
INSERT INTO FactTransaction values(1, 20210102, 4, 15)

INSERT INTO FactTransaction values(1, 20210103, 3, 5)
INSERT INTO FactTransaction values(1, 20210103, 4, 10)
INSERT INTO FactTransaction values(1, 20210103, 5, 20)
INSERT INTO FactTransaction values(1, 20210103, 1, 20)


--Shop 2
INSERT INTO FactTransaction values(2, 20210103, 2, 10)
INSERT INTO FactTransaction values(2, 20210103, 2, 5)
INSERT INTO FactTransaction values(2, 20210103, 2, 20)
GO

INSERT INTO DimDate VALUES(20210101, '2021-01-01')
INSERT INTO DimDate VALUES(20210102, '2021-01-02')
INSERT INTO DimDate VALUES(20210103, '2021-01-03')
GO

INSERT INTO DimUser VALUES(1, 'First')
INSERT INTO DimUser VALUES(2, 'Second')
INSERT INTO DimUser VALUES(3, 'Third')
INSERT INTO DimUser VALUES(4, 'Fourth')
INSERT INTO DimUser VALUES(5, 'Fifth')

GO

INSERT INTO DimShop VALUES(1, 'Shop 1')
INSERT INTO DimShop VALUES(2, 'Shop 2')
GO
person Subbu    schedule 23.02.2021