PDA

View Full Version : مرتب کردن اطلاعات بر اساس تاریخ و کل مبلغ



ali reza mansoori 2
پنج شنبه 24 آذر 1390, 19:25 عصر
سلام دوستان
بزارید اول فیلد های بانکم رو معرفی کنم
کد--------نام---------نام خانوادگی----------مبلغ دریافتی---------تاریخ
1---------علی-------رضایی-----------------1000------------------1390/05/23
1---------علی-------رضایی-----------------2000------------------1390/07/23
1---------علی-------رضایی-----------------5000------------------1390/08/23
2---------محمد------اکبری------------------2000------------------1390/04/23
2---------محمد------اکبری------------------8000------------------1390/07/23

حالا میخوام افراد رو بر اساس تاریخ دریافت پرداخت پول ها و کل مبلغ های پرداختی مرتب کنم یعنی اگر یه نفر 6 ماه پیش 3000 تومان و 5 ماه پیش 2000 تومان داده باشه بالا تر باشه از فردی که 1 ماه پیش 7000 تومان داده
مبلغ های دریافتی هر فرد رو که میشه جمع زد و مشکلی ندارم ولی تاریخ ها رو نمیدونم چه کار کنم
یه سری میگن از تاریخ ها هم میانگین بگیر
یه سری میگن از تاریخ ها تفاضل بگیر
یه سری میگن برای هم فرد گروه درست کن بعد مرتب کن(البته اینو نفهمیدم چی بود)
حالا شما چه راهی پیش نهاد میکنید
اگر تو درک کردن اطلاعات و درخواست من مشکل دارید بگید تا کامل توضیح بدم

tazarvmmr
پنج شنبه 24 آذر 1390, 20:25 عصر
سلام
میخوای که توی گزارشت، جمع پولهایی که هر فرد داده رو نشون بدی یا نه تمام دفعات و مبلغی که هر بار داده؟

یوسف زالی
پنج شنبه 24 آذر 1390, 21:01 عصر
سلام.
اگر منظور شما رو درست متوجه شده باشم باید این جواب بده:
select Person, Sum(Price), Max(Date) from Tbl
group by Person
order by Sum(Price), Max(Date) -- sql

ali reza mansoori 2
جمعه 25 آذر 1390, 17:21 عصر
میخوای که توی گزارشت، جمع پولهایی که هر فرد داده رو نشون بدی یا نه تمام دفعات و مبلغی که هر بار داده؟
می خوام افراد رو بر اساس کل مبلغ های که دادن و تاریخ دریافت مبلغ ها مرتب کنم
حالا کل مبلغ ها رو که راحت میشه جمع کرد ولی تاریخ ها رو نیمدونم چه کار کنم

ali reza mansoori 2
جمعه 25 آذر 1390, 17:25 عصر
سلام.
اگر منظور شما رو درست متوجه شده باشم باید این جواب بده:
select Person, Sum(Price), Max(Date) from Tbl
group by Person
order by Sum(Price), Max(Date) -- sql

فکر کنم محاسبه به این روش عادلانه نباشه
شما مبلغ های دریافتی رو جمع کردید ولی از بین تاریخ ها آخرین تاریخ رو انتخاب کردید
باید با تمام تاریخ ها کار کرد و محاسبه رو روی تمام اونا انجام بدیم(البته خودمم نمیدونم چه جوری)

یوسف زالی
جمعه 25 آذر 1390, 19:32 عصر
حالا منظورتون رو متوجه شدم.
چیزی که شما دنبالش هستید در حقیقت محاسبه میانگین موزون یا همون راس گیری هست.
اگر D تاریخ و P مبلغ باشه:
Balanced Average = Sigma(P.D) / Sigma(P) = (P1.D1 + P2.D2 + ...) / (P1 + P2 + ...) ---- D is in integer form of date
بر اساس این محاسبه به هر یک عددی اختصاص می دید و بر اساس اون مرتب می کنید.
تاریخ ها رو باید در فرم عددی استفاده کنید.
فرقی نمی کنه که مثلا 12/07/1390 رو 13900712 بگیرید یا مثلا تعداد روزهایی که از تاریخ خاصی شروع می شن. مثلا بگید اون تاریخ رو 250 می گیرم چون از کوچکترین روز محاسبه من 250 روز بیشتره.
این روش بهتره چون ارقام کوچکتری برای ضرب و تقسیم داره اما در نهایت هر دو در محاسبات یک رنک رو تولید می کنند.

ali reza mansoori 2
شنبه 26 آذر 1390, 21:20 عصر
دوست عزیر درست متوجه منظورتون نشدم
تاریخ ها رو باید به صورت عددی ذخیره کنم!!!!! یعنی این جوری 13900520 یا .....
میشه این دستوراتی که نوشتید رو به صورت SQL پیاده سازی کنید

یوسف زالی
شنبه 26 آذر 1390, 21:56 عصر
تاریخ ها رو باید تبدیل به عدد کنید.
یا با replace و یا با توابعی که خودتون نوشتید.
اگر باز هم متوجه نشدید در خصوص تاریخ های شمسی و محاسباتش در همین سایت جستجو کنید.

ali reza mansoori 2
یک شنبه 27 آذر 1390, 21:00 عصر
select replace(convert(varchar, getdate(),101),'/','') ========>> 12302006
منظورتون از replace همین هستش دیگه

یوسف زالی
یک شنبه 27 آذر 1390, 21:19 عصر
شبیه به این.اما به جای getdate زمان ثبت شده باید باشه.

ali reza mansoori 2
شنبه 03 دی 1390, 17:54 عصر
دوستان من از این کد برای میانگین گرفتن از تاریخ ها استفاده کردم
همه میدونیم که تاریخ و ساعت از یک عدد اعشاری تشکیل شده مثلا 222132.1312 که اشاره به یک زمان خاصی میکند. قسمت صحیح اون تاریخ و قسمت اعشار اون ساعت رو نشون میده
حالا کد من میاد تاریخ رو به روش بالا به عدد تبدیل میکنه و از اون میانگین میگیره
اگر روش کاری که من استفاده کردم مشکل داره لطفا راهنمایی کنید
AVG(CONVERT(bigint, CONVERT(datetime,Tabel1.TT))) AS Avg_TT

یوسف زالی
شنبه 03 دی 1390, 21:37 عصر
اشکال کار شما در اینه:
شخص الف دو بار پول می ده. یک بار 10 روز قبل 1000 تومن و یک بار 1 روز قبل 10,000 تومن
شخض ب هم دو بار پول می ده. یک بار 10 روز قبل 10,000 تومن و یک بار 1 روز قبل 1000 تومن
در محاسبات شما عدالت بین این دو نفر رعایت نخواهد شد مگر اینکه از روشی که گفتم استفاده کنید.

ali reza mansoori 2
سه شنبه 06 دی 1390, 12:30 عصر
بله دوست عزیز شما درست میگی من این دو نفر رو وارد بانکم کردم و نتایج اشتباه بود یعنی شخص الف اول و شخص ب دوم شده بود که کاملا اشتباه است
متاسفانه روشی رو که گفتید من درست متوجه نشدم
اگر امکان داره کمی بیشتر درباره این روش توضیح بدید
خیلی ممنون
یا علی

یوسف زالی
سه شنبه 06 دی 1390, 13:56 عصر
در بالا هم اشاره کردم.
محاسبات باید موزون باشه.
روشش هم توضیح دادم.
کجاش رو متوجه نشدید؟

ali reza mansoori 2
سه شنبه 06 دی 1390, 14:28 عصر
اگر D تاریخ و P مبلغ باشه:
Balanced Average = Sigma(P.D) / Sigma(P) = (P1.D1 + P2.D2 + ...) / (P1 + P2 + ...) ---- D is in integer form of date
بر اساس این محاسبه به هر یک عددی اختصاص می دید و بر اساس اون مرتب می کنید.

P که مبلغ هستش و مشکلی نیست
D هم تاریخ هستش ولی فرمتش چه جوری باید باشه؟ (شمسی - قمری - عددی - .... ):متفکر:

اگر بخواییم روی همون مثال شما کار کنیم باید همچین چیزی در بیاد درسته؟
شخص الف ( 10000+1000)/((10000*تاریخ یک روز قبل)+(1000*تاریخ ده روز قبل))

یوسف زالی
سه شنبه 06 دی 1390, 14:53 عصر
بله.
در مورد تاریخ هم گفتم تفاوتی نمی کنه.
باید تبدبل کنید به عدد.
هر جوری که دوست دارید.

ali reza mansoori 2
سه شنبه 06 دی 1390, 15:25 عصر
خیلی ممنون
شرمنده اینقدر سوال میکنم ها
تاریخ ها رو میتونم با این کد تبدیل کنم
CONVERT(bigint, CONVERT(datetime,Tabel1.TT))

یوسف زالی
سه شنبه 06 دی 1390, 19:43 عصر
بله فقط احتمال سرریز در محاسبات رو هم در نظر بگیرید. چون اعداد ممکنه خیلی بزرگ بشن.

ali reza mansoori 2
چهارشنبه 07 دی 1390, 12:26 عصر
برای جلو گیری از این کار باید چه کار کنم؟
آیا میتونم اعدادی که محاسبه میکنم رو بر 2 تقسیم کنم بعد محاسبات رو انجام بدم؟

یوسف زالی
چهارشنبه 07 دی 1390, 14:05 عصر
بله می تونید همه رو به یک عدد ثابت تقسیم کنید.

pashna
جمعه 09 دی 1390, 22:49 عصر
سلام دوست عزیز،

می‌خواستم بدونم شما به جوابتون رسیدید یا نه، چون من هرچی‌ میخونم میبینم به نظرم جواب نیست!

یوسف زالی
شنبه 10 دی 1390, 00:58 صبح
دوست عزیز این روش مرتب کردن میانگین موزون نام داره.
توقع شما از جواب چیه؟
فرمول رو که دادم. نمونه رو که گذاشتم.
تبدیلات رو هم گفتم.
الان باید دقیقا چه اتفاقی بیفته تا "جواب" باشه؟
برای من هم روشن کنید تا از این به بعد خودم رو اصلاح کنم.
شاید من کل مسیر رو اشتباه متوجه شدم.

pashna
شنبه 10 دی 1390, 02:02 صبح
سلام دوست من ،

این بنده خدا می‌خواد مجموع پرداختی توسط هر نفر و تاریخ آخرین پرداخت رو داشته باشه، یعنی‌ خروجی این کؤری باید نام، مجموعِ پرداختی و تاریخ آخرین پرداخت باشه.

حالا سوال من اینه که کؤری شما چه شکلیه، همین.

اینکه قاطی‌ کردن نداره عزیزم

یوسف زالی
شنبه 10 دی 1390, 03:03 صبح
علیک سلام.
من قاطی نکردم. فقط یک لحظه شک کردم نکنه کل مسیر رو اشتباه رفتم.
برداشت موضوعی خودم:


یعنی اگر یه نفر 6 ماه پیش 3000 تومان و 5 ماه پیش 2000 تومان داده باشه بالا تر باشه از فردی که 1 ماه پیش 7000 تومان داده



اگر منظور شما رو درست متوجه شده باشم باید این جواب بده:
.....



فکر کنم محاسبه به این روش عادلانه نباشه
شما مبلغ های دریافتی رو جمع کردید ولی از بین تاریخ ها آخرین تاریخ رو انتخاب کردید
باید با تمام تاریخ ها کار کرد و محاسبه رو روی تمام اونا انجام بدیم



حالا منظورتون رو متوجه شدم.
چیزی که شما دنبالش هستید در حقیقت محاسبه میانگین موزون یا همون راس گیری هست.
اگر D تاریخ و P مبلغ باشه:
Balanced Average = Sigma(P.D) / Sigma(P) = (P1.D1 + P2.D2 + ...) / (P1 + P2 + ...) ---- D is in integer form of date



کد من میاد تاریخ رو به روش بالا به عدد تبدیل میکنه و از اون میانگین میگیره



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



بله دوست عزیز شما درست میگی من این دو نفر رو وارد بانکم کردم و نتایج اشتباه بود

و ...

من از این روند به محاسبات موزون برحسب تاریخ - مبلغ می رسم.
برداشت شما دوست من چیه؟



این بنده خدا می‌خواد مجموع پرداختی توسط هر نفر و تاریخ آخرین پرداخت رو داشته باشه،



فکر کنم محاسبه به این روش عادلانه نباشه
شما مبلغ های دریافتی رو جمع کردید ولی از بین تاریخ ها آخرین تاریخ رو انتخاب کردید


آیا راه رو اشتباه رفتم یا شما حوصله نداشتید و سریع قضاوت کردید؟

بهتره دوست عزیزی که سوال رو پرسیده یک اشاره ای کنه ببینیم مساله ایشون بیراهه رفته یا داریم به نتیجه می رسیم..

pashna
شنبه 10 دی 1390, 08:22 صبح
سلام، منم فکر می‌کنم برداشتم مثل شما است، و از جوابتون خوشم اومد، ولی‌ فکر می‌کنم شاید من اشتباه فهمیدم، برای همین می‌خواستم ببینم در نهایت چه شکلی‌ شده، برای همینه که میگم کوریش چه شکلیه :)

ali reza mansoori 2
دوشنبه 17 بهمن 1390, 11:40 صبح
دوستان من برنامه رو تحویل دادم و هنوز گزارشی مبنی بر درست کار نکردن به من داده نشده است
از دوست خوبم You-See تشکر میکنم که منو برای محاسبه این مسئله راهنمایی کردند

برای روشن شدن دوباره مسئله یکم بیشتر توضیح میدم تا دوستان دیگه بتونن بهتر درک کنند
فرض کنید یه قطعه زمین رو میخواید بین 50 نفر به صورت مساوی تقسیم کنید اصلی ترین مشکل شما اینه که کی کدوم قسمت رو برمیداره یعنی یکی میخواد زمینش بیفته سر کوچه یکی میخواد بیفته لب نبش یکی میخواد زمینش بیفته داخل کوچه و ....

حالا فرض کنید هر کدام از این 50 نفر پولی که برای خرید یک قطعه از این زمین پرداخت کردند اصلا روی اصول و مرتب نباشه یعنی نفر اول یه سال پیش کل مبلغ رو داده یا نفر دوم ماهی 20 تومان پرداخت کرده یا نفر سوم همه رو آخر سر پرداخت کرده
خوب معلومه که نفری که یک سال پیش مبلغ رو پرداخت کرده امتیاز بیشتری باید داشته باشه و زمین بهتر باید بهش بدیم بعد نفر دوم و بعد نفر سوم
حالا برای محاسبه این امتیاز ها روشی رو که دوستمون You-See معرفی کرد رو انتخاب کردم
فکر کنم دیگه متوجه صورت سوال شده باشید
یا علی