首页 > 解决方案 > 如何将 SQL 转换为 DAX,需要添加 FILTER

问题描述

我想创建计算表来总结In_Force现有表中的溢价fact_Premium

我怎样才能通过说过滤结果:

TODAY() has to be between `fact_Premium[EffectiveDate]` and (SELECT TOP 1 fact_Premium[ExpirationDate] ORDE BY QuoteID DESC)

在 SQL 中,我会这样做:

    `WHERE CONVERT(date, getdate()) between CONVERT(date, tblQuotes.EffectiveDate) 
and (
      select top 1 q2.ExpirationDate 
        from Table2 Q2 
        where q2.ControlNo = Table1.controlno 
        order by quoteid` desc
       )

到目前为止,这是我的 DAX 声明:

In_Force Premium = 
    FILTER(
        ADDCOLUMNS(
        SUMMARIZE(
           //Grouping necessary columns
            fact_Premium,
            fact_Premium[QuoteID],
            fact_Premium[Division],
            fact_Premium[Office],
            dim_Company[CompanyGUID],
            fact_Premium[LineGUID],
            fact_Premium[ProducerGUID],
            fact_Premium[StateID],
            fact_Premium[ExpirationDate]
                  ),    
            "Premium", CALCULATE(
                                SUM(fact_Premium[Premium])
                                ),
            "ControlNo", CALCULATE(
                            DISTINCTCOUNT(fact_Premium[ControlNo])
                                  )

   ), // Here I need to make sure TODAY() falls between fact_Premium[EffectiveDate] and (SELECT TOP 1 fact_Premium[ExpirationDate] ORDE BY QuoteID DESC)
    )

另外,从 fact_Premium 创建计算表或使用 sql 语句(--> Get Data--> SQL Server)创建同一个表会更有效吗?

标签: tsqlpowerbidaxpowerbi-desktop

解决方案


T-SQL 中有 2 种可能的方式来获取下一个生效日期。一种是使用LEAD(),另一种是使用APPLY运算符。由于这里有一些事实可以使用,因此是示例

select *
from (
      select *
      , lead(EffectiveDate) over(partition by CompanyGUID order by quoteid desc) as NextEffectiveDate
      from Table1
      join Table2 on ...
     ) d

或者

select table1.*, oa.NextEffectiveDate
from Table1
outer apply (
    select top(1) q2.ExpirationDate AS NextEffectiveDate
    from Table2 Q2 
    where q2.ControlNo = Table1.controlno 
    order by quoteid desc
     ) oa

注意。anouter apply有点类似于 a left join,因为它允许查询返回具有 NULL 的行,如果不需要,则cross apply改为使用。

在这两种方法中,您都可以NextEffectiveDate在最后的 where 子句中引用,但如果可行(这取决于数据),我宁愿避免使用 convert 函数。


推荐阅读