代码之家  ›  专栏  ›  技术社区  ›  Serdia

如何将SQL翻译成DAX,需要添加过滤器

  •  0
  • Serdia  · 技术社区  · 6 年前

    我想创建一个计算表来汇总 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)
        )
    

    另外,还有什么更有效的方法,从事实高级创建计算表,或者使用sql语句创建相同的表(-->获取数据-->SQL Server)?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Adrian Maxwell    6 年前

    T-SQL中有两种可能的方法来获取下一个生效日期。一是使用 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
    

    注意。一 outer apply left join 在这种情况下,它将允许查询返回带有NULL的行(如果不需要的话) cross apply

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