将具有连接和窗口功能的SQL转换为DAX

时间:2019-11-04 14:21:26

标签: sql sql-server dax cube dimensional-modeling

我有一个有效的SQL查询,但需要将其翻译为DAX,但我很挣扎。

这是我要实现的目标:

我在事实表中的协议从startdateenddate。全年运行的协议计为1,表示DATEDIFF(startdate, enddate) / 365.0给出协议的“权重”。需要查看任何给定的月份并获得过去一年总协议权重的总和。我还有一个与事实表相关的维度表,其中包含所有日期(单日以及它们所属的年/月),这使我可以执行以下SQL查询以获取我想要的内容:

SELECT
   sub.yearMonth
   ,SUM(sub.[cnt]) OVER (ORDER BY sub.[yearMonth] DESC ROWS BETWEEN 11 PRECEDING AND CURRENT ROW) / 365.0 AS [runningYear]
FROM
   (SELECT 
       d.yearMonth
       ,COUNT(*) AS [cnt] 
    FROM Agreememts AS a
    INNER JOIN Date AS d
       ON d.date >= a.startddate AND d.date <= a.enddate
    GROUP BY d.yearMonth
) AS sub

我尝试将其复制到DAX度量中,最终得到以下结果:

AgreementWeights:=
CALCULATE (
   CALCULATE (
      COUNTROWS ( 'Agreements' );
      FILTER (
        'Agreements';
        'Agreements'[startdate] <= MAX ( 'Date'[date] )
            && 'Agreements'[enddate] >= EDATE ( MAX( 'Date'[date] ); -12)
      )
   );
   CROSSFILTER ( 'Agreements'[receiveddate]; 'Date'[sys_date_key]; NONE )
)

最后一行是将关系从recieveddate剪切到日期维度,这与此处无关。此DAX查询产生太多行,但是在像(result/365)*100这样划分时给出正确的结果,而我根本不知道为什么。

事实表Agreements的示例:

  ID   startdate   enddate     recieveddate
  0    10-04-2014  12-06-2015  10-03-2014
  1    11-06-2014  11-07-2014  11-05-2014

维度表Date的示例:

  ID   date        yearMonth   sys_date_key
  0    10-04-2014  April2014   10042014
  1    11-04-2014  April2014   11042014

谢谢:)

0 个答案:

没有答案