PDA

View Full Version : مشکل در محاسبه



farshid_82
دوشنبه 16 مرداد 1391, 17:10 عصر
سلام
دوستان من با کد زیر مانده هر سطر رو محاسبه می کنم ولی مشکل اینجاست که وقتی چند رکورد در یک روز یعنی با یک تاریخ ثبت میشه اشتباه محاسبه میکنه.البته تو شرط از فیلد کلید بجای تاریخ استفاده کنم درست میشه ولی نیاز که بر اساس تاریخ محاسبه و مرتب بشه.لطفا راهنمائی کنید

select TR.*,(Select SUM(TR2.DBR) - SUM(TR2.CDR) From TBL_TRANSACTIONS TR2 Where TR2.SDate <= TR.SDate) as HBalance
from TBL_TRANSACTIONS TR
ORDER BY TR.SDate,TR.ID

baktash.n81@gmail.com
سه شنبه 17 مرداد 1391, 07:34 صبح
سلام
دوست عزیز خوب کدی که شما نوشتی خطا منطقی داره ... یعنی اجرا می شه ولی درست حساب نمی کنه برای فهمیدن مشکل نیاز به اطلاعات بیشتری هست ... اگه ممکنه ساختار جدول و نیازتون رو به صورت مثال اینجا قرار بدید ...

مکته این روشی که شما کد نوشتید یکی از کند ترین کدهای موجود تو SQL هست ... برای اینکه به ازاء هر رکورد تو Select بیرونی یه بار Select داخلی اجرا میشه ...

farshid_82
سه شنبه 17 مرداد 1391, 10:55 صبح
خیلی از جوابتون ممنونم
راستش چون حجم اطلاعات شاید طی 5 سال به 3000 رکورد برسه از این کد استفاده کردم.نمی دونم شاید برای این تعداد هم سرعت پائین باشه اگه بیشنهادی دارید ممنون می شم بگید.
در مورد کد بالا مشکل تو 2 رکورد علامت دار تو تصویر پائین هست هر جا رکورد ها با تاریخ یکسان ثبت بشه ای مشکل پیش میاد.

farshid_82
سه شنبه 17 مرداد 1391, 17:12 عصر
جالبه روشی که اینجا گفته هم همین مشکل داره

http://www.sqlservercentral.com/articles/T-SQL/68467/

Reza_Yarahmadi
سه شنبه 17 مرداد 1391, 18:15 عصر
در صورت استفاده از SQL Server 2005 به بالا میتونید بصورت زیر عمل کنید
Declare @Tbl Table(SDate varchar(10), Cash int, Pay int)

Insert Into @Tbl Values ('1390/11/10', 10000, 0)
Insert Into @Tbl Values ('1390/12/09', 10000, 0)
Insert Into @Tbl Values ('1390/12/11', 2000, 0)
Insert Into @Tbl Values ('1390/12/11', 0, 1000)
Insert Into @Tbl Values ('1390/12/16', 10000, 0)
Insert Into @Tbl Values ('1390/12/17', 0, 1500)

;With tbl as (
Select
Row_Number() Over(Order By SDate) as RowID
,*
From
@Tbl)
, Result (ID, SDate, Cash, Pay, Remind) as(
Select
RowID
,SDate
,Cash
,Pay
,Remind = Cash - Pay
From tbl
Where RowID = 1
UNION ALL
Select
ID = ID + 1
,T.SDate
,T.Cash
,T.Pay
,Remind = R.Remind + T.Cash - T.Pay
From
tbl T INNER JOIN Result R
ON
T.RowID = R.ID + 1
)
Select * From Result