PDA

View Full Version : سوال: اصلاح کوئری امتیاز دهی



sh
سه شنبه 28 آبان 1387, 19:16 عصر
سلام

در یکی از برنامه هام برای امتیاز دهی بر اساس مبلغ و زمان واریز وجه بدین صورت عمل میشه که هر 10000 ریال مبلغ واریز شده در هر روز یک امتیاز داره . مثلا اگر بنده در تاریخ 1/1/87 مبلغ 1500000 ریال واریز کرده باشم ابتدا مبلغ تقسیم بر 10000 ریال میشه و سپس در تعداد روزهای مابین 1/1/87 الی روز گزارش گیری ضرب میشه و این امتیاز مربوط به اولین واریز من هست. اگر تعداد واریز ها متعدد باشه برای هر واریز به روش فوق عمل میشه و در کل جمع امتیازهای فرد برای هر واریز به عنوان امتیاز کل شخص محاسبه میشه. تا اینجای کار مشکلی نیست و با کوئری زیر انجام میشه


SELECT Person.pname ,SUM(AccountList.price) AS tprice, SUM(DATEDIFF(Day, AccountList.mdate, @MDate)
* (AccountList.price / 10000)) AS Point, AccountList.pcode
FROM AccountList INNER JOIN
Accounts ON AccountList.accountc = Accounts.accountc INNER JOIN
Person ON AccountList.pcode = Person.pcode
WHERE (AccountList.mdate <= @MDate) AND (Person.isactive = @isactive) AND (AccountList.billdate <= @billdate)
GROUP BY AccountList.pcode, Person.pname


در کوئری بالا :
price = مبلغ واریز شده
mdate= تاریخ واریز به میلادی

حالا من میخوام یه فیلد از نوع boolean به جدول AccountList اضافه کنم و کوئری بالا را جوری تغییر بدم که برای هر رکورد اگر اون فید True بود امتیازش هر چی میشه تقسیم بر 2 بشه و اگر مقدار اون فیلد False بود مقدار امتیازش بصورت عادی و به روش بالا حساب بشه


اول میخواستم کوئری رو تغییر بدم که به جای اینکه جمع امتیاز همه مبالغ واریز شده توسط یک شخص رو بده بیاد امتیاز هر واریزی رو حساب کنه و در یک جدول دیگه بریزه و بعد من برای هر ردیف اون جدول اگر ستون مربوطه True بود امتیازش رو نصف کنم و بعد Group By کنم و نشون بدم ولی امیدوارم بشه این کوئری رو تغییر داد تا نتیجه دلخواه رو بده من چند بار سعی کردم متاسفانه نتونستم درست انجام بدم . اگر ممکنه یه راهنمائی بفرمائید

mohinsoft
سه شنبه 28 آبان 1387, 20:41 عصر
select fldmyrequest=(case fldboolean when 1 then fldvalue/2 when 0 then fld end),* from mytable

mbm124
سه شنبه 28 آبان 1387, 23:15 عصر
سلام تابع DATEDIFF چه فعاليتي مي كند با تشكر

sh
چهارشنبه 29 آبان 1387, 00:30 صبح
سلام تابع DATEDIFF چه فعاليتي مي كند با تشكر


اختلاف بین تاریخ را برمیگرداند
-----------------------------------------------------------


قبلا از Case استفاده کردم ولی در کوئری هایی به سادگی کوئری که شما مثال زدین. اگر ممکنه صرفا کوئری داده شده را اصلاح کنید. مشکلی که هست اینه که Point یک ستون آماده نیست و ماحصل چند عملیات هست :


SUM(DATEDIFF(Day, AccountList.mdate, @MDate)
* (AccountList.price / 10000)) AS Point


و وقتی اون رو توی شرط Case میگذارم کار نمیده

منتظر راهنمائی دوستان هستم