|
Опять Нарастающий итог
|
|||
---|---|---|---|
#18+
Приветствую всех. Проблема с нарастающим итогом, смотрел FAQ, но не смог переделать под свой случай. Необходимо реализовать без курсоров и CTE. Есть таблица оплат клиентов, скажем 2010-11-01 10:57:56 1 21000 2010-11-01 15:55:43 1 19000 2010-11-03 08:51:17 1 30000 2010-11-03 14:09:16 1 15000 2010-11-04 09:01:15 1 25000 2010-11-05 09:33:28 1 35000 Необходимо получить нарастающий итог с добавлением входящего определенного значения - 1000, т.е. 2010-11-01 10:57:56 1 1000 21000 22000 2010-11-01 15:55:43 1 22000 19000 41000 2010-11-03 08:51:17 1 41000 30000 71000 2010-11-03 14:09:16 1 71000 15000 86000 2010-11-04 09:01:15 1 86000 25000 111000 2010-11-05 09:33:28 1 111000 35000 146000 делаю так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Но не могу передать в качестве входящего остатка накопленное значение. Подскажите камрады. Скрипты для создания таблиц и заполнения тестовыми данными: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2011, 09:48 |
|
Опять Нарастающий итог
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2011, 10:12 |
|
Опять Нарастающий итог
|
|||
---|---|---|---|
#18+
Geep, не выдает нужный результат, мне нужно чтобы был и входящий остаток и чтобы он переходил от предыдущей записи но! ваш код натолкнул меня на такой вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Что выдает нужный результат, но может быть есть решение более оптимальнее, потому как данных будет "куча", на тестовых записях все срабатывает быстро, но на больших не будет ли проблем ;-( ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2011, 10:20 |
|
Опять Нарастающий итог
|
|||
---|---|---|---|
#18+
можно ли последнйи вариант преобразовать под вариант в FAQ ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2011, 11:36 |
|
Опять Нарастающий итог
|
|||
---|---|---|---|
#18+
Нашел одну здесь , где рассматриваются различные методы решения задачи с нарастающим итогом. Автор показывает метод с применением локального переменного. При таком методе время выполнения меньше всех методов (подзапрос, self join, курсор): Recently I was looking at an existing view on a client's SQL server 2005 database. This view calculated the running total for a transaction amount from a table, but was performing very poorly. I had always believed there were three different methods for calculating a running total using TSQL: 1. Use a nested sub-query 2. Use a self join 3. Use Cursors My own personal preference was to use the cursors option. If the cursor guidelines are followed, I've always found this to be the quickest, because the other two methods involve multiple scans of the table. The key for the cursor method is to ensure the data you are "cursoring" through is in the correct order, as the query optimzier does not understand cursors. This usually means cursoring through the data by clustered index, or copying the data into a temp table / table var first, in the relevant order. A blog posted by Garth Wells back in 2001 gives these three techniques ( http://www.sqlteam.com/article/calculating-running-totals) I came across a fourth technique for the running total calculation, which is related to the cursor method. Like the cursor method, it involves a single scan of the source table, then inserting the calculated running total for each row into a temp table or table variable. However, instead of using a cursor, it makes use of the following UPDATE command syntax: UPDATE table SET variable = column = expression The TSQL to calculate the running total is: DECLARE @SalesTbl TABLE (DayCount smallint, Sales money, RunningTotal money) DECLARE @RunningTotal money SET @RunningTotal = 0 INSERT INTO @SalesTbl SELECT DayCount, Sales, null FROM Sales ORDER BY DayCount UPDATE @SalesTbl SET @RunningTotal = RunningTotal = @RunningTotal + Sales FROM @SalesTbl SELECT * FROM @SalesTbl I tested this query along with the other three methods on a simple set of test data (actually the same test data from Garth Wells’ blog mentioned above). The results of my test runs are: Nested sub-query=9300 ms Self join=6100 ms Cursor=400 ms Update to local variable=140 ms I was surprised just how much faster using the “Update to a local variable” method was. I expected it to be similar to the cursor method, as both involve a single scan of the source table, and both calculate the running total once only for each row in the table. The Nested Sub-query and Self join methods are so much slower because they involve the repeated recalculation of all of the previous running totals. вот код: Код: 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. 12. 13. 14. 15. 16. 17. 18.
Не могу переделать данный вариант под свой случай, подсобите други ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2011, 13:01 |
|
Опять Нарастающий итог
|
|||
---|---|---|---|
#18+
2 раза выполняется UPDATE: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2011, 13:18 |
|
Опять Нарастающий итог
|
|||
---|---|---|---|
#18+
orunbek Не могу переделать данный вариант под свой случай, подсобите други Ну и фигли тут делать? Код: plaintext
и ФСЕ. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2011, 13:26 |
|
Опять Нарастающий итог
|
|||
---|---|---|---|
#18+
aleks2, Мне нужен не только нарастающий итог, но и входящий остаток а входящий остаток это нарастающий итог от предыдущей записи, т.е. при этом входящий остаток берется от переменной (@inc = 1000) IncomingPaysRunningTotal@inc 1000 20002000 500 25002500 3000 5500 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2011, 13:37 |
|
Опять Нарастающий итог
|
|||
---|---|---|---|
#18+
решил покамест сделать через двойной UPDATE, если у кого-нибудь будет более реальный вариант дайте знать, спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2011, 16:14 |
|
|
start [/forum/topic.php?fid=46&msg=37059374&tid=1684019]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 149ms |
0 / 0 |