Ssas 获取MDX查询特定时间内的不同用户计数

Ssas 获取MDX查询特定时间内的不同用户计数,ssas,mdx,olap,cube,Ssas,Mdx,Olap,Cube,我需要一些mdx帮助 多维数据集详细信息: 度量.Users->Distinct Count on 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

我需要一些mdx帮助

多维数据集详细信息:

度量.Users->Distinct Count on 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)
您可以使用MDX函数

官方文档不是很清楚,但是,一般原则是:向该函数传递一个“集合”,以获得不同的值

示例MDX

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
您可以使用MDX函数

官方文档不是很清楚,但是,一般原则是:向该函数传递一个“集合”,以获得不同的值

示例MDX

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

内置的distinct count度量提供了最大的灵活性。听起来你已经有了一个度量值。用户?用户的度量值组是否连接到日期和店铺位置的维度

为了帮助实现这一点,我将回顾多对多革命论文中的独特计数模式。这种方法提供了一种更灵活、可能运行更快的无代码解决方案:


内置的独特计数度量提供了最大的灵活性。听起来你已经有了一个度量值。用户?用户的度量值组是否连接到日期和店铺位置的维度

为了帮助实现这一点,我将回顾多对多革命论文中的独特计数模式。这种方法提供了一种更灵活、可能运行更快的无代码解决方案:


内置的独特计数度量提供了最大的灵活性。听起来你已经有了一个度量值。用户?用户的度量值组是否连接到日期和店铺位置的维度?是否有使用计算列的方法?我认为用户度量值组未连接到日期。它可能已连接。我会在多对多革命论文中应用独特的计数模式,以获得更灵活、可能运行更快的无代码解决方案:@MikeHoney您最初的评论帮助我解决了这个问题。谢谢。不用担心-作为回答,转载给我的多巴胺打击。内置的独特计数测量提供了最大的灵活性。听起来你已经有了一个度量值。用户?用户的度量值组是否连接到日期和店铺位置的维度?是否有使用计算列的方法?我认为用户度量值组未连接到日期。它可能已连接。我会在多对多革命论文中应用独特的计数模式,以获得更灵活、可能运行更快的无代码解决方案:@MikeHoney您最初的评论帮助我解决了这个问题。谢谢。不用担心-转载作为回答,为我的多巴胺击中。