PDA

View Full Version : جمع مقادیر تا رکورد جاری



niloo17
یک شنبه 14 آذر 1389, 09:55 صبح
سلام دوستان
من یک جدول دارم که در ان (شناسه ،مبلغ، شناسه مشتری ، نوع(دریافت ، پرداخت) )
چه جوری می تونم مجموع مبلغ مخصوص به یک مشتری را تا رکورد جاری بر اسا اینکه دریافت است یا پرداخت به دست بیارم

حمیدرضاصادقیان
یک شنبه 14 آذر 1389, 10:18 صبح
میتونید به این شکل عمل کنید.



Select Sum(Case When Type=1 Then price Else 0 End) Daryaft,Sum(Case When Type=0 Then price Else 0 End) Pardakht from Table1
Where Customerid=10

niloo17
یک شنبه 14 آذر 1389, 11:47 صبح
ممنون از راهنماییتون من می خوام تا رکورد جاری جمع در هر ردیف مشخص باشه



SELECT T1.ID, SUM(T2.Price), T1.CustomerID,T1.Type
FROM dbo.DocumentDetailView T1
JOIN dbo.DocumentDetailView T2
ON T2.ID <= T1.ID
GROUP BY T1.CustomerID,T1.ID,T1.Type

من با استفاد ه از این روش جمع رکورد جاری را به دست اوردم ولی نمی دونم چه جوری می تونم بر اساس type مرتب کنم یعنی مجموع دریافت و پرداخت را جدا حساب کنم
ممنون می شم اگه راهنماییم کنید

حمیدرضاصادقیان
یک شنبه 14 آذر 1389, 12:40 عصر
سلام.
به این شکل بنویسید.


SELECT T1.ID, SUM(CASE WHEN t1.Type=0 THEN T2.Price ELSE 0 End) Daryaft,SUM(CASE WHEN t1.Type=1 THEN T2.Price ELSE 0 End) pardakht, T1.CustomerID,T1.Type
FROM dbo.DocumentDetailView where (T1.Type) as T1
JOIN dbo.DocumentDetailView T2
ON T2.ID <= T1.ID
GROUP BY T1.CustomerID,T1.ID,T1.Type

niloo17
یک شنبه 14 آذر 1389, 22:09 عصر
ممنون از راهنماییتون
ولی کوئری که نوشتین خطا می ده میشه راهنماییم کنید

حمیدرضاصادقیان
دوشنبه 15 آذر 1389, 07:28 صبح
نباید مشکلی داشته باشد.
لطفا پیغام خطا رو بنویسید.

niloo17
دوشنبه 15 آذر 1389, 08:06 صبح
سلام
اون قسمت خط سوم where (T1.Type) as اینو برداشتم چون ا زas خطا می داد
بعد خطای زیر را میده


The multi-part identifier "T1.ID" could not be bound.
The multi-part identifier "T1.CustomerID" could not be bound.
The multi-part identifier "T1.Type" could not be bound.

حمیدرضاصادقیان
دوشنبه 15 آذر 1389, 08:45 صبح
شما اگر میخواهید مقدار جمع رو تا آخرین ردیف بدست بیارید نیازی به join ندارید.
باهمون دستور اولی که نوشتم مشکل حل میشه.
join رو از توی این کوئری نیز حذف کنید باید به جواب برسید.

niloo17
دوشنبه 15 آذر 1389, 09:51 صبح
اگه join را حذف کنم کوئری خطا می ده
و اگرم هم از اون کوئری که اول نوشتین استفاده کنم کلا مقدار صفر در هر دو ستون بر می گردونه روش اول شما فقط یک ردیف بر می گردونه در حالی که من می خوام همه ردیف ها را برگردونه به اضافه یک فیلد که جمع رکورد ها باشه پس مجبورم ا زjoin استفاه کنم
ممنون می شم اگه راهنماییم کنید .

حمیدرضاصادقیان
دوشنبه 15 آذر 1389, 10:01 صبح
این کد رو تست کنید.



SELECT T2.ID, DAryaft,Pardakht,T2.CustomerID,T2.Type
FROM dbo.DocumentDetailView T1
JOIN
(
SELECT SUM(CASE WHEN Type=0 THEN Price ELSE 0 End) Daryaft,
SUM(CASE WHEN Type=1 THEN Price ELSE 0 End) pardakht,
Customerid,Type,id
FROM dbo.DocumentDetailView
GROUP BY Customerid,Type,Id
) AS T2 ON t1.id=t2.id

niloo17
دوشنبه 15 آذر 1389, 11:12 صبح
ممنون کوئری اجرا می شه ولی اصلا مقادیر جمع نمی شه و همون مقادیر خود فیلد را نمایش می ده :ناراحت:

حمیدرضاصادقیان
دوشنبه 15 آذر 1389, 12:48 عصر
شما backup دیتابیس رو قرار بدید.

niloo17
دوشنبه 15 آذر 1389, 13:24 عصر
این backup برنامه است ممنون از راهنماییتون

حمیدرضاصادقیان
دوشنبه 15 آذر 1389, 15:00 عصر
شما کوئری رو به این شکل بنویسید.
باید نتیجه زیر رو به شما نمایش بده.


SELECT T1.CustomerID,T1.Type, SUM(CASE WHEN t1.Type=0 THEN T2.Price ELSE 0 End) Daryaft,SUM(CASE WHEN t1.Type=1 THEN T2.Price ELSE 0 End) pardakht
FROM dbo.DocumentDetailView T1
JOIN dbo.DocumentDetailView T2
ON T2.ID <= T1.ID
GROUP BY T1.CustomerID,T1.Type
ORDER BY T1.Customerid

niloo17
دوشنبه 15 آذر 1389, 18:25 عصر
سلام
ممنون از راهنماییتون
ولی منظور من اینه که همه ردیف ها را داشته باشم مثل همون کوئری که خودم نوشتم
من این کوئری را واسه گزارشم می خوام یعنی یک گزارش کلی که تو هر گزارش مقدار مبلغ دریافتی و پرداختی تا اون رکورد خاص به من نشون بده :متفکر::متفکر:

حمیدرضاصادقیان
سه شنبه 16 آذر 1389, 07:16 صبح
سلام.بهتر بود اینطوری می پرسیدید. که میخواهید مانده گزارش رو تا همون ردیف داشته باشید.
برای گرفتن مانده این لینک (http://barnamenevis.org/showthread.php?224230-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%DB%8C%DA%A9-%D8%B5%D9%88%D8%B1%D8%AA%D8%AD%D8%B3%D8%A7%D8%A8-%D8%AF%D8%B1-sql2000) رو ببینید.

niloo17
سه شنبه 16 آذر 1389, 08:20 صبح
سلام ممنون از لطفتون
من یه مشکل دارم اینکه می خوام مانده حساب بر اساس هر مشتری جدا حساب کنه یعنی مانده حساب برای هر مشتری جدا حساب بشه ؟؟!!!

حمیدرضاصادقیان
سه شنبه 16 آذر 1389, 08:49 صبح
خوب الان این کوئری به صورت سطر به سطر مانده رو حساب میکنه. اگر شما فیلد CustomerId رو بیارید و به ترتیب اون Sort کنید فکر میکنم باید جوابتون رو بگیرید.