|
FIFO от последнего остатка
|
|||
---|---|---|---|
#18+
Ув.Эксперты, поиск по форуму, конечно, дал некоторую пищу для размышления, но полного понимания нет и я прошу помочь советом. Задача такая: нужна реализация партиционного учета по модели FIFO для таблицы приходов/расходов. т.е., нужно сопоставить операции прихода/расхода (в обратном порядке), разбить их по партиям и посчитать остатки после каждой операции. Akinaпрямой связи прихода с расходом нет - то есть один приход может быть поделен на несколько расходов, причём два из них поделены между ним и другим приходом и все это на Microsoft SQL Server 2008 R2 (SP2) - 10.50.4321.0 (Build 7601: Service Pack 1) Дано (упрощенно): 1. таблица прихода/расхода - примерно, такого содержания: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
2. и есть информация об остатке этого товара (в др.таблице): Код: sql 1. 2.
в первом приближении получается такая конструкция: Код: sql 1. 2. 3. 4. 5. 6. 7.
в конечном итоге нужно получить следующее: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
От курсоров отказался (т.к., это должна быть view и важна производительность) в пользу CTE, но и тут проблема в условиях отбора и максимум чего удалось добиться: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Поделитесь, пожалуйста, рабочими идеями как решить эту задачу? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2015, 13:50 |
|
FIFO от последнего остатка
|
|||
---|---|---|---|
#18+
Spl@sH, можно рекурсивным CTE и вспомогательной функцией. В таблице t - создать индекс по полям cod, dt, id. А вообще-то, было бы быстрее, если бы там вместо dt и id было одно поле, уникальное и упорядоченное по дате - его и брать в индекс. В крайнем случае, можно сделать вычисляемое. Код: sql 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.
В исходных данных ошибка? У меня в результате начальная цифра остатка получается 3000, а у Вас - 0. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2015, 14:17 |
|
FIFO от последнего остатка
|
|||
---|---|---|---|
#18+
А вообще-то, в таком виде задача напоминает сумму с накоплением (если только нет усложняющих условий). Для которой есть много отработанных решений. Вот, например, так ещё можно: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2015, 14:56 |
|
FIFO от последнего остатка
|
|||
---|---|---|---|
#18+
Serg_77mВ исходных данных ошибка? У меня в результате начальная цифра остатка получается 3000, а у Вас - 0.+1 у меня тоже Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2015, 15:07 |
|
|
start [/forum/topic.php?fid=46&gotonew=1&tid=1696818]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
23ms |
get topic data: |
10ms |
get first new msg: |
7ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 278ms |
total: | 396ms |
0 / 0 |