Возвращает значение предыдущей строки поля промежуточного результата - PullRequest
0 голосов
/ 06 августа 2020

У меня есть поле, которое служит промежуточной суммой (Фактический конечный баланс). Теперь мне нужно поле, которое делает то же самое, но возвращает значение предыдущей строки. Вот мой запрос:

select
    convert(date,c.TRANSDATE) as Transdate,

    sum(sum(case when c.LEDGERACCOUNT like '113120%' and (c.VOUCHER like 'civ%' or c.VOUCHER like 
   'cnv%' or c.VOUCHER like 'wo%' or c.VOUCHER like 'fti%' or c.VOUCHER like 'fcr%' or c.VOUCHER like 
   'arp%' or c.VOUCHER like 'arr%' or c.VOUCHER like 'arm%' or c.VOUCHER like 'aro%')  
    then convert(decimal(10,2),c.AMOUNTMST) else 0 end)) over (order by c.transdate) as 'Actual 
    Ending Balance'


from AX2cTest.[dbo].CUSTTRANS_V c

group by c.TRANSDATE

Это пример данных с нужным мне столбцом (Начальный баланс):

Transdate   Beginning Balance   Actual Ending Balance
4/12/2019       null                  -50129.26
4/15/2019     -50129.26               -50524.21
4/25/2019     -50524.21               -52300.21

Я столкнулся с ошибками при попытке использовать функцию LAG для решения эта проблема:

select
    convert(date,c.TRANSDATE) as Transdate,

    lag(sum(sum(case when c.LEDGERACCOUNT like '113120%' and (c.VOUCHER like 'civ%' or c.VOUCHER like 
    'cnv%' or c.VOUCHER like 'wo%' or c.VOUCHER like 'fti%' or c.VOUCHER like 'fcr%' or c.VOUCHER 
    like 'arp%' or c.VOUCHER like 'arr%' or c.VOUCHER like 'arm%' or c.VOUCHER like 'aro%')  
    then convert(decimal(10,2),c.AMOUNTMST) else 0 end)) over (order by c.transdate)) over (order by 
    c.transdate) as 'Beginning Balance',

    sum(sum(case when c.LEDGERACCOUNT like '113120%' and (c.VOUCHER like 'civ%' or c.VOUCHER like 
   'cnv%'or c.VOUCHER like 'wo%' or c.VOUCHER like 'fti%' or c.VOUCHER like 'fcr%' or c.VOUCHER like 
   'arp%' or c.VOUCHER like 'arr%' or c.VOUCHER like 'arm%' or c.VOUCHER like 'aro%') then 
    convert(decimal(10,2),c.AMOUNTMST) else 0 end)) over (order by c.transdate) as 'Actual Ending 
    Balance'


from AX2cTest.[dbo].CUSTTRANS_V c

group by c.TRANSDATE

Ошибка:

Оконные функции не могут использоваться в контексте другой оконной функции или агрегата

Не уверен, как решить эту проблему или может есть альтернатива? Спасибо

Моя последняя попытка:

select
    convert(date,c.TRANSDATE) as Transdate,

    lag(sum(sum(case when c.LEDGERACCOUNT like '113120%' and (c.VOUCHER like 'civ%' or c.VOUCHER like 'cnv%' or c.VOUCHER like 'wo%' or c.VOUCHER like 'fti%' or c.VOUCHER like 'fcr%' or c.VOUCHER like 'arp%' or c.VOUCHER like 'arr%' or c.VOUCHER like 'arm%' or c.VOUCHER like 'aro%')  
    then convert(decimal(10,2),c.AMOUNTMST) else 0 end)) over (order by c.transdate)) over (order by c.transdate rows between unbounded preceding and 1 preceding)  as 'Beginning Balance',



    sum(sum(case when c.LEDGERACCOUNT like '113120%' and (c.VOUCHER like 'civ%' or c.VOUCHER like 'cnv%' or c.VOUCHER like 'wo%' or c.VOUCHER like 'fti%' or c.VOUCHER like 'fcr%' or c.VOUCHER like 'arp%' or c.VOUCHER like 'arr%' or c.VOUCHER like 'arm%' or c.VOUCHER like 'aro%')  
    then convert(decimal(10,2),c.AMOUNTMST) else 0 end)) over (order by c.transdate) as 'Actual Ending Balance'

    
from AX2cTest.[dbo].CUSTTRANS_V c

group by c.TRANSDATE

ошибка: функция «задержка» может не иметь рамки окна.

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Попробуй, может тебе поможет

WITH balanceCalc AS (select
    convert(date,c.TRANSDATE) as Transdate,

    sum(sum(case when c.LEDGERACCOUNT like '113120%' and (c.VOUCHER like 'civ%' or c.VOUCHER like 
   'cnv%' or c.VOUCHER like 'wo%' or c.VOUCHER like 'fti%' or c.VOUCHER like 'fcr%' or c.VOUCHER like 
   'arp%' or c.VOUCHER like 'arr%' or c.VOUCHER like 'arm%' or c.VOUCHER like 'aro%')  
    then convert(decimal(10,2),c.AMOUNTMST) else 0 end)) over (order by c.transdate) as '[Actual_Ending_Balance]'


from AX2cTest.[dbo].CUSTTRANS_V c

group by c.TRANSDATE)

SELECT 
    Transdate,
    LAG([Actual_Ending_Balance],1) OVER (
        ORDER BY Transdate
    ) as 'Beginning Balance',
    [Actual_Ending_Balance]
FROM 
    balanceCalc;
1 голос
/ 06 августа 2020

Вы можете добавить условие рамки окна:

(order by c.transdate rows between unbounded preceding and 1 preceding)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...