我有一个表格,简化如下 - FactSales:
Date Reference Amount TypeId Seller
1/10/2013 A1 100 1 100
3/10/2013 A2 200 1 200
5/10/2013 A1 -100 2 100
DimType 的外键表 - 1 作为销售,2 作为退款,和 DimSellers。还有一个 DimDate 表等。
本质上,这一切都被处理到一个 SSAS 多维数据集中,现在我正在尝试创建 MDX 查询以计算销售总数,而不是销售金额的总和。列应代表卖方,并将过去 12 个月到当前的月份排成一行。 我能够成功地对列中的卖家和行中的月份进行计数,但只过滤类型 1 以进行销售。
我有点不明白的是,如果销售在同一个月内没有退款(类型 2),则销售只能算作当月的销售。如果在 type 1 sale 后的 future 一个月内退款,则应计算在内。如果在售出当月退款,则不应算作销售。
预期结果应该来 self 的示例。由于 A1 在售出的同月退款,因此不计入 10 月的销售。
Seller 100. Seller 200. ...
Oct 13. 0. 1
Sept 13 ...
Aug 13 ...
...
Nov 12 ...
感谢任何帮助。
最佳答案
假设你的立方体中的对象命名如下:
- 卖家属性:
[DimSeller].[Seller]
, - 日期层次结构:
[DimTime].[Date]
级别Month
包含月份, - 类型属性层次结构:
[DimType].[Type]
键 1 和 2, - 基于
Amount
列的度量具有名称Amount
, - 有一个属性层次结构
[Sale].[SaleId]
标识不同的销售事件(据我所知,您需要计算销售事件,而不是卖家), - 您的多维数据集名为
CubeName
。
那么下面的 MDX 应该会提供你想要的东西:
WITH Member [Measures].[SellerCount] AS
Filter( [Sale].[SaleId].[SaleId].Members * { [DimType].[Type].&[1] }
(
[DimSeller].[Seller].CurrentMember,
[DimTime].[Date].CurrentMember,
[DimType].[Type].&[2], Measures.Amount
) = 0
).Count
SELECT [DimSeller].[Seller].[Seller].Members
ON COLUMNS,
[DimTime].[Date].[Month].Members
ON ROWS
FROM [CubeName]
WHERE [Measures].[SellerCount]
这假设没有正退款,即。 e.金额为 0 的退款不算在内,并且一个月内的多次(可能是负数和正数)退款总和为 0 是不可能的。
但是,您也可以通过属性 e 来实现它。 G。 “在同一个月有退款”并假设度量“销售事件计数”就像事实表上的计数一样,那么用户可以或多或少地在每个可以访问多维数据集的客户端工具中使用它,因为不会有任何需要 WITH
子句:MDX 将只是:
SELECT [DimSeller].[Seller].[Seller].Members
ON COLUMNS,
[DimTime].[Date].[Month].Members
ON ROWS
FROM [CubeName]
WHERE (
[Measures].[Sales Event Count],
[Sales].[Has Refund In Same Month].[Yes]
)
要实现这一点,您可以在 DSV 中添加一个列作为命名列,或者使用以下 SQL 代码在您的表的 View 中添加:
CASE WHEN EXISTS ( SELECT 1
FROM table e
WHERE DatePart(Month, e.Date) = DatePart(Month, mainTable.Date)
AND DatePart(Year, e.Date) = DatePart(Year, mainTable.Date)
AND e.Seller = mainTable.Seller
)
THEN 'Yes'
ELSE 'No'
END
关于sql-server - SQL Server SSAS MDX 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19925943/