|
Изменение данных сразу в двух таблицах. как лучше?
|
|||
---|---|---|---|
#18+
Есть 2 таблицы. В первой (Т1) id1,id2,сумма - таблица генерится каждый месяц новая. Во второй (Т2) id1,id2,дата,сумма - идёт добавление записей каждый месяц, причём (id1+id2) может повторяться в разных месяцах. Задача: уменьшить суммы в Т1 на общую (по всем датам) величину сумм из Т2 (по соответствующим id1 и id2), при этом не уйти в Т1 ниже нуля И уменьшить общую сумму в Т2 на соответствующую величину. Желательно уменьшать, начиная с более старых значений. Т.е. например, в Т1 есть запись {1,1,100}, а в Т2 есть 2 записи {1,1,дата1,65}{1,1,дата2,90} Должно получиться соответственно {1,1,0} и {1,1,дата1,0}{1,1,дата2,55} В голове пока нашлось место для двух вариантов. Какой лучше, и, может, есть "более нормальное" решение? Уменьшение сумм по Т1 - очевидно, так Код: plaintext 1. 2. 3. 4. 5.
А вот варианты обработки Т2 В1 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2009, 20:02 |
|
Изменение данных сразу в двух таблицах. как лучше?
|
|||
---|---|---|---|
#18+
tanglir, Если в t1 id1,id2-уникальны в пределах все таблички, то можно попробовать нижеприведенным способом, а остатки ,если они есть , по второй табличке должны приходится всегда на последнюю дату если я ничего не намудрил ...: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2009, 10:07 |
|
Изменение данных сразу в двух таблицах. как лучше?
|
|||
---|---|---|---|
#18+
Tohan_ORA, это было то, о чём я подумал в первую очередь. Но, насколько я понимаю, в результате этого Код: plaintext 1. 2.
Tohan_ORAа остатки ,если они есть , по второй табличке должны приходится всегда на последнюю дату Но мне-то надо отслеживать, с какой даты они уже "ушли", а на какой ещё "остались". Скинуть всё в кучу на последнюю дату - решило бы проблему "параллельного" изменения данных, но создало бы другую - отследить, откуда взялась и почему снялась какая-то конкретная сумма, стало бы вообще невозможно ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2009, 12:06 |
|
Изменение данных сразу в двух таблицах. как лучше?
|
|||
---|---|---|---|
#18+
tanglirTohan_ORA, это было то, о чём я подумал в первую очередь. Но, насколько я понимаю, в результате этого Код: plaintext 1. 2.
Честно говоря не совсем понятно,что вы имеете в виду . в табл 2 проставится итоговый остаток вычисленный в result который всегда будет приходится на последнюю дату по группе ид1,ид2 Приведите пример данных когда запрос будет выдавать 'не правильный' с вашей точки зрения результат. Что есть: t1 id1id2sm1110012301310149 t2 id1id2dtsm1110-Jun-09651115-Jun-09901210-Jun-09291215-Jun-09901310-Jun-0911315-Jun-091 Результат запроса result id1id2smost_t1dtost_t211100015-Jun-09551230015-Jun-09891310815-Jun-090 Что будет: t1upd id1id2sm110120138149 t2upd id1id2dtsm1110-Jun-0901115-Jun-09551210-Jun-0901215-Jun-09901310-Jun-0901315-Jun-090 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2009, 13:34 |
|
Изменение данных сразу в двух таблицах. как лучше?
|
|||
---|---|---|---|
#18+
Поправлю: Result id1id2smost_t1dtost_t211100015-Jun-09551230015-Jun-09901310815-Jun-090 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2009, 13:42 |
|
Изменение данных сразу в двух таблицах. как лучше?
|
|||
---|---|---|---|
#18+
Tohan_ORAв табл 2 проставится итоговый остаток вычисленный в result который всегда будет приходится на последнюю дату по группе ид1,ид2 Пример: Т1 1 1 1001 2 200 Т2 1 1 2009-03-01 201 1 2009-04-01 1001 1 2009-05-01 2501 2 2009-04-01 95 Должно получиться 1 1 01 2 105 1 1 2009-03-01 01 1 2009-04-01 80 1 1 2009-05-01 250 1 2 2009-04-01 0 А получается 1 1 01 2 105 1 1 2009-03-01 01 1 2009-04-01 0 1 1 2009-05-01 330 1 2 2009-04-01 300 То есть ВСЯ сумма уходит на последнюю дату, чего мне категорически не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2009, 19:54 |
|
Изменение данных сразу в двух таблицах. как лучше?
|
|||
---|---|---|---|
#18+
Поправлюсь надо так Должно получиться 1 1 01 2 105 1 1 2009-03-01 01 1 2009-04-01 20 1 1 2009-05-01 250 1 2 2009-04-01 0 А выходит 1 1 01 2 105 1 1 2009-03-01 01 1 2009-04-01 0 1 1 2009-05-01 270 1 2 2009-04-01 300 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2009, 19:58 |
|
Изменение данных сразу в двух таблицах. как лучше?
|
|||
---|---|---|---|
#18+
Так пойдет? Называется это остаток с нарастающим итогом. Возможно можно ещё более упростить,это запрос на вскидку ... :-) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2009, 20:22 |
|
Изменение данных сразу в двух таблицах. как лучше?
|
|||
---|---|---|---|
#18+
Tohan_ORA, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
PS. Узнал/понял кое-что новое про join'ы с условием неравенства и агрегатные функции. Оппаньки. Ошибочка с моей стороны. Забыл упомянуть, что в Т2 могут таки быть и отрицательные суммы (соответственно увеличивающие значения в Т1). С ними не работает :( Хм, интересно, а что мне вообще с минусами надо будет делать? Если заменить в последнем примере строку "1 1 2009-05-01 250" на "1 1 2009-05-01 -80", то снимать надо будет только 40 рублей, но мои алгоритмы снимут их с первой сотни и оставят 60,20 и -80 рублей соответственно, Ваш же запрос просто проигнорирует минуса. Короче, буду с минусами разбираться, отпишусь, когда станет ясно, что с ними вообще делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2009, 21:38 |
|
Изменение данных сразу в двух таблицах. как лучше?
|
|||
---|---|---|---|
#18+
Можно, конечно, придумать "хитромудрый" запрос (например, в последнем примере еще проверять SUM() на знак), только, как ты потом во всей этой "каше" разбираться будешь? Через месяц...полтора, когда понадобиться кое-что изменить в алгоритме? Пиши циклы. Во-первых, они понятнее, а, во-вторых, в них проще вносить модификации, если понадобиться. Насколько я понимаю, T1 - это некоторый "кредит" и надо вычесть этот "кредит" из сумм платежей. Причем вычитание идет по датам. Ну, и решай эту задачу "в лоб" Код: plaintext 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.
Если в таблице T2 возможно существование нескольких записей с одинаковой датой для одних и тех же кодов id1 и id2, то вместо ldLastDate надо записывать идентификатор записи таблицы T2. Т.е. поле или набор полей по которым можно однозначно идентифицировать запись. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2009, 22:47 |
|
Изменение данных сразу в двух таблицах. как лучше?
|
|||
---|---|---|---|
#18+
ВладимирМЕсли в таблице T2 возможно существование нескольких записей с одинаковой датой для одних и тех же кодов id1 и id2, то вместо ldLastDate надо записывать идентификатор записи таблицы T2. Т.е. поле или набор полей по которым можно однозначно идентифицировать запись. Да нет, такого не предвидится (тройка id1,id2,dt уникальна в Т2). А в общем, Вы подтвердили мою первоначальную мысль - делать через циклы. Спасибо всем за помощь! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2009, 06:45 |
|
|
start [/forum/topic.php?fid=41&tid=1586335]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
others: | 318ms |
total: | 441ms |
0 / 0 |