|
|
|
Количество месяцев долга. Как получить одним запросом ?
|
|||
|---|---|---|---|
|
#18+
Я только начал познавать PL/SQL в Oracle 11g. Задачу решил через организацию цикла. Возможно ли решение через запрос ? Предполагаю, что есть решение с помощью оконных функций, но пока не хватает понимания их работы. Задача следующая: 1. Есть две таблицы: клиенты с их текущим балансом (customers) + суммы начислений за каждый месяц (calcs) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 2. Нужно определить количество месяцев для условия: abs(минимальная СУММА по calc_money для cust_id) >= abs(balance для cust_id) P.S. Мое решение: в цикле увеличивал отрицательный balance для cust_id на calc_money каждого месяца, начиная с текущего и "спускаясь" по месяцам в прошлое. Считал полученное кол-во месяцев до тех пор, пока balance >= 0 . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 07:17 |
|
||
|
Количество месяцев долга. Как получить одним запросом ?
|
|||
|---|---|---|---|
|
#18+
lolo-soft, приведите Ваше решение, будет более понятно что Вам надо напр month_calc месяц или дата? уникально или нет? и желательно тестовые данные гляньте на sum( calc_money) over (partition by cust_id order by month_calc date DESC) ...... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 15:38 |
|
||
|
Количество месяцев долга. Как получить одним запросом ?
|
|||
|---|---|---|---|
|
#18+
stax , спасибо за ответ. Тестовые данные: Код: 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. Мое решение: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 06:26 |
|
||
|
Количество месяцев долга. Как получить одним запросом ?
|
|||
|---|---|---|---|
|
#18+
stax..lolo-soft, приведите Ваше решение, будет более понятно что Вам надо напр month_calc месяц или дата? уникально или нет? и желательно тестовые данные гляньте на sum( calc_money) over (partition by cust_id order by month_calc date DESC) ...... stax Ну и дальше просто: select cust_id,balance,count(*) from ( select c.balance, s.cust_id, sum( calc_money) over (partition by s.cust_id order by month_calc DESC) s_sum from calcs s ,customers c where s.cust_id=c.cust_id) where balance+s_sum <=0 group by balance,cust_id order by 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 16:45 |
|
||
|
Количество месяцев долга. Как получить одним запросом ?
|
|||
|---|---|---|---|
|
#18+
lolo-soft, получилось? ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2017, 16:28 |
|
||
|
Количество месяцев долга. Как получить одним запросом ?
|
|||
|---|---|---|---|
|
#18+
Спасибо ВСЕМ !! Этот запрос работает. Основную задачу решает. Нужно будет учесть только один момент - если всех начислений не будет "хватать", чтобы "погасить" текущий баланс. Решение от fortnet Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 04:51 |
|
||
|
Количество месяцев долга. Как получить одним запросом ?
|
|||
|---|---|---|---|
|
#18+
Правильно ли понимаю - как будет работать подзапрос " ...sum( calc_money) over (partition by s.cust_id order by month_calc DESC) as s_sum.... " - суммировать (группировать) значения calc_money для каждого месяца month_calc только из значений предыдущих месяцев, отсортированных по убыванию, для каждого cust_id ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 05:03 |
|
||
|
Количество месяцев долга. Как получить одним запросом ?
|
|||
|---|---|---|---|
|
#18+
Да, при отсутствии задания параметров окна работает по умолчанию так (согласно заданной сортировке). Это можно посмотреть : select cust_id, calc_money, month_calc , sum( calc_money) over (partition by s.cust_id order by month_calc DESC) s_sum from calcs s order by cust_id,month_calc desc; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2017, 09:24 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=178&tid=1886523]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 357ms |

| 0 / 0 |
