PDA

View Full Version : نمایش آخرین اطلاعات ثبت شده درباره یک کارمند



aliyeh
دوشنبه 07 آذر 1390, 12:03 عصر
سلام
دوستان من یک جدول دارم که اطلاعات قراردادهای هرکدام از کارمندام در اون ذخیره میشه.از اونجایی که قراردادها کوتاه مدت هست(مثلا 3 ماهه) بنابراین هر فرد ممکنه چندین قرارداده ثبت شده داشته باشه.
زمانیکه قرارداد یک فرد تموم میشه براش قرارداد جدید ثبت میشه و وضعیت قرارداد قبلی به حالت تسویه شده در میاد.
حالا من میخوام از جدولم یک select بگیرم که اطلاعات آخرین قرارداد کارمند که تسویه شده رو بهم بده،اما نمی دونم باید چطور این کارو انجام بدم؟
این فکر به ذهنم رسید که بزرگترین تاریخ ثبت قرارداد کارمند رو پیدا کنم و اگه وضعیتش برابر با "تسویه شده" بود نمایشش بدم اما نمیدونم چطوری
این دستور جواب نمیده
select * from Employee where Edate=(select MAX(EmploymentDate) from TB_Treaty where EN=? )
چون نمی دونم به جای ؟ چی باید بزارم.

Galawij
دوشنبه 07 آذر 1390, 12:26 عصر
سلام،
فیلدی را که برای نگهداری نوع کارمند هست (فعال، غیرفعال) چی در نظر گرفتید؟ کلید خارجی هست یا یک فیلد از نوع بیتی؟

aliyeh
دوشنبه 07 آذر 1390, 13:32 عصر
چون بیشتر از 2 حالت بود (فعال،غیرفعال،تسویه شده،و...) از نوع smallint در نظر گرفتم

spinelruby
دوشنبه 07 آذر 1390, 14:08 عصر
اسم فیلدای جدولتو کامل میگی ؟

aliyeh
دوشنبه 07 آذر 1390, 14:38 عصر
ببینید دوستان جدول های برنامه من به این صورت هست

http://1.aseo.netii.net/images/888241374e8c.jpg

EN شماره کارمندی هر کدوم از کارمندان هست
برای هر قرارداد یک تاریخ شروع و پایان قرارداد وجود داره (startdate و enddate)
حالا من می خوام یک کوئری داشته باشم که رکوردهای اون اطلاعات آخرین قرارداد ثبت شده هر کارمند باشه که وضعیتش 1 (یعنی تسویه شده) باشه

baktash.n81@gmail.com
دوشنبه 07 آذر 1390, 16:48 عصر
با سلام

چند روش برای اینکار وجود داره

روش اول :

دستور زیر رو نگاه کن

Select Top 1 s.Description From Employee join status as s on status_id=s.ID where EN=@EN order by startdate desc

این دستور الان یک EN می گیره و Status مربوط به اونو برمی گردونه ... حالا اگه میخوای به صورت لیست آخرین اطلاعات همه رو داشته باشی می تونی اینو به عنوان یک Function ذخیره کنی و به عنوان یک فیلد توی view نمایش بدیش ...

اما توجه داشته باش این روش خیلی کنده به اعضای هر رکورد یک بار دستور داخل تابع اجرا می شه ... البته می تونی یکم تغییر توش بدی تا سریعتر بشه اما ...

برای روش دوم اگه Sql 2008 داری یه نگاهی به دستور Cross Apply بنداز مشکلت روحل می کنه و خیلی هم بهتره ...

یوسف زالی
دوشنبه 07 آذر 1390, 21:51 عصر
سلام.
این کار ساده تر از اونی هست که درگیر توابع و Cross و این چیز ها بشید:

select *
from Employee
join
(
select EN as SN, max(EndDate) as Dt
from Employee
where StatusID = 1
group by EN
)X
on EN = SN and EndDate = Dt

aliyeh
سه شنبه 08 آذر 1390, 08:16 صبح
سلام ، ممنون از توجه و کمکتون
من راهی که گفته بودید امتحان کردم و پاسخش به صورت زیر بود:
http://1.aseo.netii.net/images/c16c57ed363c.jpg
یعنی اگه یک کارمند 2 تا قرارداد داشته باشه که یکیش حالت "تسویه شده" باشه در هر صورت نشونش میده و کاری نداره که این حالت مربوط به آخرین قرارداد اون هست یا نه.در واقع max(enddate) رو نادیده میگیره
می خوام بدونم که اگه راهی نداره برم سراغ برنامه نویسیش.شاید اونجا بتونم یه کاری کنم

aliyeh
سه شنبه 08 آذر 1390, 10:28 صبح
دوستان حل شد کدی که yousijoon لطف کرده بود و گذاشته بود رو کمی تغییر دادم و حل شد
select *
from Employee
join
(
select EN as SN, max(Date) as Dt
from employee

group by EN
)X

on EN = SN and EmploymentDate= Dt
where Status =1


شرط رو خارج از join قراردادم :لبخندساده: