PDA

View Full Version : پیاده سازی محاسبات در query



sadaf_
پنج شنبه 04 اسفند 1390, 14:39 عصر
سلام

من می خوام در view یا sp یک محاسبه به این صورت انجام بدم
که دو تا رکورد با هم جمع بشه و حاصل با حاصل دو رکورد بعدی جمع بشه و همین طور ادامه داشته باشه

مثال:
بدهکار بستانکار مانده
10-------- 0------ 10
40--------0-------50
0 --------20------ 30
در این مثال به این صورت که
بدهکار از بستانکار بزرگتره پس بدهکار منهای بستانکار می شه
در رکورد بعدی هم بدهکار از بستانکار بزرگتره پس اون هم منهای بستانکار می شه و در مانده با مانده قبلی جمع می شه
در رکورد بعدی بستانکار از بدهکار بزرگتره پس بستانکار منهای بدهکار می شه و از مانده قبلی کم می شه و در ستون مانده رکورد خودش قرار می گیره
خواهشمندم کمک کنید
اگر باز هم توضیح خواستید بگید تا بگم
ممنون

A.Farzin
پنج شنبه 04 اسفند 1390, 18:58 عصر
اين كد را مي‌تواني استفاده كني. البته به جاي خطوط 5 الي 15 بايد SELECT جدول خودت رو بگذاري.


WITH CTE1 AS
(
SELECT ROW_NUMBER() OVER (ORDER BY ID ASC) AS Ro, ID, tmp.BED, tmp.BES
FROM (
SELECT 100 as ID, 10 as BED, 0 as bes
UNION ALL
SELECT 102 as ID, 40 as BED, 0 as bes
UNION ALL
SELECT 103 as ID, 0 as BED, 20 as bes
UNION ALL
SELECT 104 as ID, 90 as BED, 0 as bes
UNION ALL
SELECT 107 as ID, 0 as BED, 50 as bes
UNION ALL
SELECT 110 as ID, 0 as BED, 30 as bes
) tmp
)

SELECT Ro, ID, BED, BES, (SELECT SUM(CTE1.BED-CTE1.BES) FROM CTE1 WHERE t.Ro >= CTE1.Ro) as MANDEH
from CTE1 t
اين رو هم بگم كه اين روش در SQL 2005 و بالاتر جواب مي‌دهد.

sadaf_
جمعه 05 اسفند 1390, 12:07 عصر
من رنگ بنفش در این دستور نمی بینم
من یک view 93000 رکوردی دارم آیا این روش کند نیست؟

Arash_janusV3
جمعه 05 اسفند 1390, 14:15 عصر
declare @tbl table(Id int,Namevarchar(50), price int, sum1 int)
insertinto @tbl select*,0 from tbl_test
declare @id int, @price int, @sum int
set @sum = 0
DECLARE sum_cursor CURSOR
FORSELECT id, price FROM @tbl
OPEN sum_cursor
FETCHNEXTFROM sum_cursor
INTO @id, @price
WHILE@@FETCH_STATUS= 0
BEGIN
update @tbl set sum1 = @sum where Id = @Id
select @sum = @sum + @price
FETCHNEXTFROM sum_cursor
INTO @id, @price
END
CLOSE sum_cursor
DEALLOCATE sum_cursor
select*from @tbl

Arash_janusV3
جمعه 05 اسفند 1390, 15:39 عصر
درود
این روش هم هست اما یک مقدار کند

Select debit,credit, (Select Sum(debit) - Sum(credit) from asli Where id <= ss.id) As Mande
From asli ss

sadaf_
جمعه 05 اسفند 1390, 19:13 عصر
declare @tbl table(Id int,Namevarchar(50), price int, sum1 int)
insertinto @tbl select*,0 from tbl_test
declare @id int, @price int, @sum int
set @sum = 0
DECLARE sum_cursor CURSOR
FORSELECT id, price FROM @tbl
OPEN sum_cursor
FETCHNEXTFROM sum_cursor
INTO @id, @price
WHILE@@FETCH_STATUS= 0
BEGIN
update @tbl set sum1 = @sum where Id = @Id
select @sum = @sum + @price
FETCHNEXTFROM sum_cursor
INTO @id, @price
END
CLOSE sum_cursor
DEALLOCATE sum_cursor
select*from @tbl

این روش سرعتش خوبه اما از ردیف بعدی محاسبه می کنه و غلط حساب می کنه
خواهشا یکی بگه چه تغییری باید بدم که از ردیف اول شروع به محاسبه کنه؟

Arash_janusV3
شنبه 06 اسفند 1390, 11:06 صبح
این روش سرعتش خوبه اما از ردیف بعدی محاسبه می کنه و غلط حساب می کنه
خواهشا یکی بگه چه تغییری باید بدم که از ردیف اول شروع به محاسبه کنه؟

درود
متن update رو بگذار قبل از into
بدرود