2016-08-24 1 views
0

У меня следующий запрос: я хочу добавить свой запрос left join with CTE, как это сделать, пожалуйста, помогите мне, потому что у меня есть идентификатор драйвера, я хочу второй последний идентификатор драйвера, но я хочу добавить left join с КТРКак добавить левое соединение с CTE, проверить мой запрос

 select d.Id,d.DriverNo,d.DriverName,TransId=dc.Id,dc.FromDate,dc.ToDate,dc.IsPaid, 
     Active=(case when (dc.weekoff is null or dc.weekoff=0) then 'Active' else 'Off' end), 
     Rent=(case when (IsNull(dc.CommissionTotal,0))> IsNull(dc.AccJobsTotal,0) then IsNull(dc.CommissionTotal,0)-(IsNull(dc.AccJobsTotal,0)) else 0 end), 
     BalanceDue=IsNull(dc.OldBalance,0), 
     AgentCommission=IsNull(dc.AgentFeesTotal,0), 
     PDA= (case when (dc.weekoff is null or dc.weekoff=0) then (IsNull(dc.PDARent,0)+IsNull(dc.CollectionDeliveryCharges,0)) else 0 end), 
     Total=(case when (IsNull(dc.CommissionTotal,0))> IsNull(dc.AccJobsTotal,0) then IsNull(dc.CommissionTotal,0)-(IsNull(dc.AccJobsTotal,0)) else 0 end) 
     +((IsNull(dc.OldBalance,0)) 
     +((IsNull(dc.AgentFeesTotal,0))) 
     +(case when (dc.weekoff is null or dc.weekoff=0) then (IsNull(dc.PDARent,0)+IsNull(dc.CollectionDeliveryCharges,0)) else 0 end)) 
     from Fleet_Driver d 
     inner join Fleet_DriverCommision dc 
     on d.Id=dc.DriverId 
     where dc.Id in (select Max(Id) from Fleet_DriverCommision 
     group by DriverId) as T1 
     left join on 


> LEFT JOIN WITH CTE 


     With cte as 
     (select AgentFeesTotal,DriverId,Row_Number()over(Partition by DriverID order by Transdate desc) as Rn, 
     count(1)over(Partition by DriverID) as cnt from Fleet_DriverCommision) 
     Select AgentFeesTotal,DriverId 
     from cte 
     Where (Rn = 2 and cnt > 1) or (Rn = 1 and cnt = 1) 

Это пример

с КТР как (выберите AgentFeesTotal, DriverId, ROW_NUMBER() над (раздел по DriverID порядке по Transdate Desc) как Rn, счетчик (1) по (Partition by DriverID) как cnt от Fleet_DriverCommision) Выбрать AgentFeesTo тал, DriverId от КТР Где (Rn = 2 и CNT> 1) или (R n = 1 и CNT = 1)

выберите t2.DriverNo из Fleet_Driver t2 влево присоединиться к КТР гр на c.DriverId = t2.Id

+0

Просьба представить минимальный рабочий пример. – buhtz

+0

с КТР как (выберите AgentFeesTotal, DriverId, ROW_NUMBER() над (раздел по DriverID порядке по Transdate Desc) в Rn, счетчик (1) по (Partition по DriverID) в качестве НКТ от Fleet_DriverCommision) Select AgentFeesTotal, DriverId от КТР Где (Rn = 2 и CNT> 1) или (R n = 1 и CNT = 1) выберите t2.DriverNo из Fleet_Driver t2 влево присоединиться к КТР гр на c.DriverId = t2.Id –

ответ

2

Похоже, вы боретесь с синтаксисом использования CTE. Объявление CTE должно выполняться до остальной части запроса, а затем ведет себя как другая таблица. Также обратите внимание, что оператор WITH должен быть первым оператором или следовать за точкой с запятой. Это должно привести вас к правильному пути. Также не забудьте проверить примеры в документации MSDN.

--With statement first - must follow ; if there are multiple statements... 
    With cte as 
    (select AgentFeesTotal,DriverId, 
    Row_Number()over(Partition by DriverID order by Transdate desc) as Rn, 
    count(1)over(Partition by DriverID) as cnt 
    from Fleet_DriverCommision 
    ) 
    -- ...then select statement... 
    select d.Id,d.DriverNo,d.DriverName,TransId=dc.Id, 
    dc.FromDate,dc.ToDate,dc.IsPaid, 
    Active=(case when (dc.weekoff is null or dc.weekoff=0) then 'Active' else 'Off' end), 
    Rent=(case when (IsNull(dc.CommissionTotal,0))> IsNull(dc.AccJobsTotal,0) then IsNull(dc.CommissionTotal,0)-(IsNull(dc.AccJobsTotal,0)) else 0 end), 
    BalanceDue=IsNull(dc.OldBalance,0), 
    AgentCommission=IsNull(dc.AgentFeesTotal,0), 
    PDA= (case when (dc.weekoff is null or dc.weekoff=0) then (IsNull(dc.PDARent,0)+IsNull(dc.CollectionDeliveryCharges,0)) else 0 end), 
    Total=(case when (IsNull(dc.CommissionTotal,0))> IsNull(dc.AccJobsTotal,0) then IsNull(dc.CommissionTotal,0)-(IsNull(dc.AccJobsTotal,0)) else 0 end) 
    +((IsNull(dc.OldBalance,0)) 
    +((IsNull(dc.AgentFeesTotal,0))) 
    +(case when (dc.weekoff is null or dc.weekoff=0) then (IsNull(dc.PDARent,0)+IsNull(dc.CollectionDeliveryCharges,0)) else 0 end)) 
    from Fleet_Driver d 
    inner join Fleet_DriverCommision dc 
    on d.Id=dc.DriverId 
    --...join in cte as a normal table 
    left join cte 
    on --join criteria here 
    where dc.Id in (select Max(Id) from Fleet_DriverCommision 
    group by DriverId) as T1 

    --move the remainder of the logic into your query 
    Select AgentFeesTotal,DriverId 
    from cte 
    Where (Rn = 2 and cnt > 1) or (Rn = 1 and cnt = 1)