Как перевести SQL в DAX, нужно добавить ФИЛЬТР - PullRequest
0 голосов
/ 21 сентября 2018

Я хочу создать вычисляемую таблицу, которая будет суммировать 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 (-> Получить данные -> SQL Server)?

1 Ответ

0 голосов
/ 21 сентября 2018

В 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

nb.outer apply немного похож на left join в том, что он позволяет запросам возвращать строки с NULL, если в этом нет необходимости, чем использовать cross apply.

В обоих случаяхподходы, которые вы можете ссылаться на NextEffectiveDate в последнем предложении where, но я бы предпочел избегать использования функции convert, если это возможно (это зависит от данных).

...