Страница 1 из 1

нарастающий итог DSQL

Добавлено: 03 апр 2014, 06:55
win
Gal 810
Платформа Oracle 10.
Необходимо вычислить дату образования сальдо. Для этого сумму сальдо на начало месяца отнимаю от суммы проводок за предыдущие месяцы.Дата проводки дающая ноль - и есть дата образования сальдо.

Есть такой запрос на SQL(вернее часть запроса)

Код: Выделить всё

SELECT
  dvmn.to_oradate(DVMN.oborot.fdatob) as datob,(DVMN.Oborot.FSumOb ) as summ,
  sum(DVMN.oborot.FSumOb) OVER (order by DVMN.oborot.fdatob desc rows unbounded PRECEDING) Summ_over
   FROM
     DVMN.Oborot
   WHERE
     DVMN.Oborot.fSchetK  = 'XX' and DVMN.Oborot.fsubschk = 'XX' and  DVMN.Oborot.FDatOb <  dvmn.to_atldate(to_date('01,03,2014', 'dd,mm,yyyy')) 
  ORDER BY DVMN.Oborot.fdatob desc
результат

Код: Выделить всё

DATOB	SUMM	SUMM_OVER
18.12.2013 0:00:00	1614007,84	1614007,84
18.12.2013 0:00:00	2585092,83	4199100,67
18.12.2013 0:00:00	1465930,24	5665030,91
18.12.2013 0:00:00	1686650,37	7351681,28
18.12.2013 0:00:00	7358,1	7359039,38
18.12.2013 0:00:00	380905,68	7739945,06
18.12.2013 0:00:00	2486435,59	10226380,65
18.12.2013 0:00:00	957820,06	11184200,71
18.12.2013 0:00:00	968403,18	12152603,89
18.12.2013 0:00:00	380905,68	12533509,57
18.12.2013 0:00:00	687565,23	13221074,8
18.12.2013 0:00:00	179904,19	13400978,99
18.12.2013 0:00:00	280727,49	13681706,48
18.12.2013 0:00:00	547608,66	14229315,14
18.12.2013 0:00:00	362861,6	14592176,74
18.12.2013 0:00:00	1500989,32	16093166,06
03.12.2013 0:00:00	430194,88	16523360,94
29.11.2013 0:00:00	932804,45	17456165,39
29.11.2013 0:00:00	1835860,86	19292026,25
29.11.2013 0:00:00	1065017,99	20357044,24
29.11.2013 0:00:00	1015800,71	21372844,95
Колонка SUMM_OVER - это нарастающий итог.

Собственно проблема заключается в том, что галактика не поддерживает конструкцию OVER (order by DVMN.oborot.fdatob desc rows unbounded PRECEDING), а только OVER (order by DVMN.oborot.fdatob).
Без обратной сортировки теряется весь смысл. Может кто сталкивался с подобной проблемой? Или есть другой способ найти дату образования сальдо

Re: нарастающий итог DSQL

Добавлено: 03 апр 2014, 11:03
edward_K
Будете смеяться, но в vipprogr.chm over описан в разделе Функции прямого SQL - Аналитические функции 5.4.22.
Наверное вы просто не под тем соусом замариновали. Имеет смысл спросить у ТП пример использования.

Re: нарастающий итог DSQL

Добавлено: 03 апр 2014, 11:14
edward_K
Нашел вот такой пример

Код: Выделить всё

   ////sqlAddStr(vliSQLCommand, '    (');
    ////sqlAddStr(vliSQLCommand, '      SUM(a.dCount_Obj) OVER');
    ////sqlAddStr(vliSQLCommand, '        (');
    ////sqlAddStr(vliSQLCommand, '          PARTITION BY a.MaxInLevel, a.KAUObj, a.cObject');
    ////sqlAddStr(vliSQLCommand, '          ORDER BY a.Npp');
    ////sqlAddStr(vliSQLCommand, '        ),');
    ////sqlAddStr(vliSQLCommand, '      0');
    ////sqlAddStr(vliSQLCommand, '    )');
но он в комменте, так что не факт, что работает. Накрайняк всегда можно сделать процедуру - вам всего то вернуть дату, когда.

Re: нарастающий итог DSQL

Добавлено: 03 апр 2014, 11:26
Den
можно попробовать вычислить уникальные разрезы по нужным Вам критериям oborot (кау1-кау6 ну и прочее) на N-ю дату где торчат остатки во временую таблицы и по ней просто потом
взять

select
min (data)
from
...
where
сумма > 0 //это если проводку сделали по дебету и кредиту в один день , то сумму задолженности как таковой не будет...
group by...

Re: нарастающий итог DSQL

Добавлено: 03 апр 2014, 11:39
win
edward_K писал(а):Будете смеяться, но в vipprogr.chm over описан в разделе Функции прямого SQL - Аналитические функции 5.4.22.
Наверное вы просто не под тем соусом замариновали. Имеет смысл спросить у ТП пример использования.
Читал справку, OVER работает, но нельзя указать направление сортировки asc/desc...

Если запустить в support, то это запрос работает

Код: Выделить всё

sql SELECT Oborot.datob, Oborot.sumOb, sum(Oborot.sumOb) OVER (order by Oborot.datob) FROM Oborot where schetK = 'T60'  and subschk  = '02' and Oborot.KAUKS[4] = '813C000000003F49' order by Oborot.datob desc;
А этот нет

Код: Выделить всё

sql SELECT Oborot.datob, Oborot.sumOb, sum(Oborot.sumOb) OVER (order by Oborot.datob DESC) FROM Oborot where schetK = 'T60'  and subschk  = '02' and Oborot.KAUKS[4] = '813C000000003F49' order by Oborot.datob desc;
В ТП обращался, сказали что в запросе если desc убрать, то все работает. Никаких альтернатив предложить не смогли.

Re: нарастающий итог DSQL

Добавлено: 03 апр 2014, 11:42
win
edward_K писал(а): но он в комменте, так что не факт, что работает. Накрайняк всегда можно сделать процедуру - вам всего то вернуть дату, когда.
можно и процедуру, но хочется обойтись меньшей кровью :)

Re: нарастающий итог DSQL

Добавлено: 03 апр 2014, 11:47
edward_K
Ну собственно вы же можете SQL выполнить и в коде.
А можно еще попробовать написать -datob или найти разницу между какой то большой датой и datob