2013-07-24 4 views
0

У меня есть данные таблицы, как показано нижеОбновление таблиц данных без использования в то время как цикл в SQL сервера в SQL 2005

id  type  amount  
1  type1  2000  
2  type1  1000  
3  type2  500  
4  type3  3000  
5  type1  2000 
6  type2  500   
7  type3  5000  
8  type1  1000  

и я хочу, чтобы получить ДАННЫЕ в выберите заявление как ниже

id  type  amount  current 
1  type1  2000   2000     
2  type1  1000   1000     
3  type2  500   500     
4  type3  3000   3000     
5  type1  2000   3000     
6  type2  -500   0     
7  type3  5000   2000 
8  type1  -1000   4000 

и так далее , что означает, что каждый тип должен иметь свою текущую общую сумму в соответствии с типом количества , и его необходимо не иметь цикла while, потому что требуется много времени для выполнения

for eg: 

in type 1 

ID  Amount  current 
1  2000-add  2000     
2  1000-sub  1000     
3  2000-add  3000     
4  1000-add  4000     

, как это сделать

+0

Можете также обновить таблицу ожидаемых результатов, теперь, когда вы изменили ваша спецификация ввода? –

+0

сейчас я исправил его @Damien_The_Unbeliever – Suresh

+0

добро пожаловать в StackOverflow, теперь вопрос -> новое сообщение – danihp

ответ

0

Я думаю, что этот запрос будет работать:

выберите идентификатор, тип, количество, (выберите сумму из таблицы t1, где t1.type = t2.type и t1.id < = t2.id) currenttotal from mytable t2

+0

ваш ответ в порядке, но я хочу, как показано выше. @rahulRanjan – Suresh

+0

Это коррелированный запрос, чтобы повысить производительность, вы должны избегать его: http://en.wikipedia.org/wiki/Correlated_subquery – danihp

0

Самостоятельно присоединиться достаточно:

select 
    t1.id, t1.type, t1.amount, sum(t2.amount) as currenttotal 
from 
    t t1 inner join t t2 
on t1.id >= t2.id and t1.type = t2.type 
group by 
    t1.id, t1.type, t1.amount 
order by t1.id 

Test it at sql fiddle:

| ID | TYPE | AMOUNT | CURRENTTOTAL | 
-------------------------------------- 
| 1 | type1 | 2000 |   2000 | 
| 2 | type1 | 1000 |   3000 | 
| 3 | type2 | 500 |   500 | 
| 4 | type3 | 3000 |   3000 | 
| 5 | type1 | 2000 |   5000 | 
| 6 | type2 | 500 |   1000 | 
| 7 | type3 | 5000 |   8000 | 
| 8 | type1 | -1000 |   4000 | 

Объяснение

Вы можете не t используйте windowed, потому что вы не агрегируете для всех строк одного и того же значения, но для предыдущих строк того же значения. Затем, вам нужно не оборудов присоединиться к той же таблице, вы получите в присоединиться все предыдущие строки (t1.id >= t2.id) одного и того же значения (t1.type = t2.type)

+0

У меня есть еще одно сомнение и нужно изменить вопрос сейчас @danihp – Suresh

+0

извините за то, что я сделал, но выше результат, о котором я упоминал в вопросе, является i хочу ...... @ danihp – Suresh