sql-server - SQL Server SSAS MDX 查询

标签 sql-server ssas mdx olap-cube

我有一个表格,简化如下 - 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/

相关文章:

sql-server - 在 SQL Server 中,如何在发生错误的触发器中查找行号?

machine-learning - 使用 SSAS 数据挖掘获取测试和训练集的评分结果

azure - Power BI 架构

ssas - MDX 计算成员并设置减法

ssis - 用于分析解析器的 XML : The XML for Analysis request timed out before it was completed

c# - 未能创建 SqlDataSourceEnumerator

sql - 无法在 SQL Server 中找到百分比

sql-server - 条件行选择

ssas - 如何进行 MDX 除了交叉连接维度查询

filter - 无法让过滤器在多个条件下工作