|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
Добрый день, форумчане! Прошу вашей помощи, 2 дня ломаю голову, как лучше сделать, всё сомневаюсь: Есть такая табличка: Date |Deal |Sum 12.12.2009 |111111 |12000 25.12.2009 |111111 |5000 12.12.2009 |122222 |10000 12.01.2010 |111111 |-10100 20.11.2009 |222221 |25000 20.12.2009 |222221 |20000 31.12.2009 |222221 |-10000 29.12.2009 |122222 |-10000 27.11.2009 |222221 |-30000 Date Дата Customer Номер клиента Deal Номер кредита Currency Валюта кредита Sum сумма, вынесенная на просрочку ("+") или выплаченная ("-") Нужно найти 1. Общую (накопленную) сумму просроченного долга непогашенную (не выплаченную) к моменту расчета. 2. Дату начала текущей (последней) просрочки. Под датой начала просрочки, в данной задаче понимается первая дата непрерывного периода, в котором общая сумма просроченного непогашенного долга > 0.Учесть, что периодов просрочек может быть несколько. 3. Кол-во дней текущей просрочки. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 14:23 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
troosheffПрошу вашей помощи, 2 дня ломаю головуТы серьезно полагаешь, что кто-то на форуме поможет ее проломить? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 14:32 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
troosheff, Уважайте людей если просите у них помощи . Дайте исходные данные таблиц в виде with table1 as (...) , table2 as (...) , и результат который Вы хотите получить . ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 14:39 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
troosheffДобрый день, форумчане! Прошу вашей помощи, 2 дня ломаю голову, как лучше сделать, всё сомневаюсь: Есть такая табличка: Date Deal Sum12.12.2009 111111 1200025.12.2009 111111 500012.12.2009 122222 1000012.01.2010 111111 -1010020.11.2009 222221 2500020.12.2009 222221 2000031.12.2009 222221 -1000029.12.2009 122222 -1000027.11.2009 222221 -30000 Date Дата Customer Номер клиента Deal Номер кредита Currency Валюта кредита Sum сумма, вынесенная на просрочку ("+") или выплаченная ("-") Нужно найти 1. Общую (накопленную) сумму просроченного долга непогашенную (не выплаченную) к моменту расчета. 2. Дату начала текущей (последней) просрочки. Под датой начала просрочки, в данной задаче понимается первая дата непрерывного периода, в котором общая сумма просроченного непогашенного долга > 0. Учесть, что периодов просрочек может быть несколько. 3. Кол-во дней текущей просрочки. используйте ТЭГ для оформления например вот так оформляются Ваши тестовые данные: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Ну и Студентам, желающим помощи приведите что Вы сделали сами, и что, именно не получается... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 15:55 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
Поминится именно это задание мне давали на входе в BTБ... Даже решение найду :) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 16:06 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
Простите за всё. Примерно что накидал, но мне не нравится, думаю над курсором: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 16:06 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
Прошу проверить, написал курсор, но чувствую, что коряво, может я как-то не таким путем рассуждаю: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 19:41 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
Может, я усложняю, а всё проще гораздо и можно простым селектом? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 19:42 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
авторdeclare n integer:=1; i integer:=1; vdeal integer:=1; vcnt integer; vdt date; --gdt date; --gdeal integer; --gamount integer; vgt RDM_CTL.TMP_TOK_20190606_inst%rowtype; cursor get_inst is SELECT * FROM RDM_CTL.TMP_TOK_20190606_inst WHERE amount > 0 order by deal, dt; begin n:=n-1; i:=0; open get_inst; DBMS_OUTPUT.ENABLE; loop fetch get_inst into vgt; if get_inst%notfound then exit; end if; exit when get_inst%notfound; if n=0 then vdeal := vgt.deal; end if; i:=i+1; if vdeal != vgt.deal then vdeal := vgt.deal; n := 0; vdt := null; end if; SELECT distinct nvl(t.amount,0) + nvl(sum(case when d.dt>=t.inst and d.dt<t.next_inst then d.amount end),0) + n, t.cnt into n, vcnt FROM (SELECT row_number()over(partition by a.deal order by a.dt) instalment ,nvl(lag(a.dt)over(partition by a.deal order by a.dt),to_date('01.01.1000','dd.mm.yyyy')) prev_inst ,a.dt inst ,nvl(lead(a.dt)over(partition by a.deal order by a.dt),to_date('01.01.4000','dd.mm.yyyy')) next_inst ,deal ,amount ,count(deal)over(partition by deal) cnt FROM RDM_CTL.TMP_TOK_20190606_inst a WHERE a.amount > 0 ) t left join RDM_CTL.TMP_TOK_20190606_inst d on t.deal = d.deal and d.amount < 0 WHERE t.deal = vgt.deal and inst = vgt.dt group by t.deal, t.inst,t.amount, t.cnt; if n>0 and vdt is null then vdt := vgt.dt; end if; if vcnt = i then i:=0; if n>0 then DBMS_OUTPUT.PUT_LINE(vdeal||'|'||n||'|'||vdt||'|'||vcnt); end if; end if; end loop; close get_inst; end; Забыл дописать: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 19:45 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
troosheff, Можно, да. Мой вариант был без курсора. PS: а второе задание есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 21:35 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
Через селект как смог: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70.
Если кто-нибудь проверит или предложит лучше решение буду благодарен) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 23:03 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
MazoHist, У меня второе на vba) А так вроде правильное решение? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2019, 23:04 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
У меня как-то покомпактнее получилось Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2019, 08:44 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
Минут за 10 накидал Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2019, 09:20 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
Dshedoo, MazoHist, Спасибо вам большое! Отчего же я такой кривой! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2019, 15:14 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
troosheffПрошу проверить, написал курсор, но чувствую, что коряво, может я как-то не таким путем рассуждаю: Аццкая жесть, ты когда нибудь программировал на процедурных языках? Один проход по исходному отсортированному набору данных без дополнительных условий (курсор) с помощью for, все остальное элементарно считается с сохранением промежуточных значений в переменных, никаких запросов внутри цикла в данном случае не требуется. Вывод с помощью dbms_output - для отладки, в твоем случае неплохо было бы сделать pipelined - функцию. Запросом, с декомпозицией и если я правильно понял условия задачи: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2019, 14:56 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
SkilledJunior, Добрый день. В соседней ветке идёт поиск решения аналогичной задачи, но под T-SQL. Обратите внимание, на практике важно не столько дату первого возникновения задолженности, сколько дату первого не закрытого начисления долга. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Первых 3 операции формируют задолженность. Если смотреть дату возникновения задолженности по состоянию на 12 октября 2009 года, то да, считается корректно. Но вот 17-го числа заходит оплата, которая частично закрывает возникшую задолженность (полностью закрываются начисления от 10 и 11 числа), но остаётся задолженность от 12-го числа. Но задолженность всё равно считается 10-10-2009. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2019, 10:28 |
|
Расчёт задолженности по LIFO
|
|||
---|---|---|---|
#18+
vladymyr.k, Если нужны какие то осмысленные промежуточные варианты, то сначала нужно определяться с алгоритмом разноски погашений на долги и тем что хотите получить в итоге. Самый простой вариант найти дату с которой началась незакрытая задолженность, найти общую сумму погашений задолженности, далее из накопительного итога долгов (за исключением погашений задолженности) эту сумму вычитать, в нашем случае сложить поскольку погашения идут с минусом, в момент перехода в + и будет моментом начала непогашенной задолженности. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2019, 00:08 |
|
|
start [/forum/topic.php?fid=52&msg=39823846&tid=1882408]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 159ms |
0 / 0 |