ورود

View Full Version : دانشجویان بیشتر از سه غیبت



hamidehsadat
سه شنبه 08 خرداد 1386, 09:12 صبح
من می خواهم یک کویری انجام بدهم که دانشجویانی که بیشتر از سه غیبت دارند را نمایش بدهند ولی یک مشکلی که دارم این است که یک دانشجو ممکن است در چند کلاس شرکت کرده باشد.
من میخواهم اگر دانشجویی در چند کلاس شرکت کرده است غیبت های هر کلاس جداگانه نشان بده.غیبت های دانشجویانم در جدول hosor ثبت می شود که فیلدها:کددانشجویی که غیبت کرده است و تاریخ جلسه
ثبت نام دانشجویانم را در جدول ثبت نام است که فیلدها:کددانشجو-کد کلاس-کد استاد-کد درس
فیلد های کویری: کددانشجویی که غیبت کرده است - تاریخ جلسه-کد کلاس-کد استاد-کد درس
لطفا مرا راهنمایی کنید

حمیدرضاصادقیان
سه شنبه 08 خرداد 1386, 09:38 صبح
خوب شما میتونی یک join بین جدول hosor و جدول کلاسهات برقرار کنی بعد شرطت رو بنویسی برای بیش از سه غیبت بعد هم group by کنی بر اساس کلاسها

arshia_
سه شنبه 08 خرداد 1386, 09:52 صبح
نحوه طراحی بانک اطلاعاتی شما زیاد منطقی نیست
بهتره بصورت نرمالسازی شده بانک بسازی
در ضمن از کلید خارجی و اصلی هم حتما استفاده کن
در اینصورت می شه اینطور برنامه نویسی کنی
جدول دانشجو:کلید اصلی شماره دانشجویی
فیلدها :نام ونام خانوادگی و...

جدول درس:کلید اصلی کد درس
فیلدها
نام درس وتعداد واحدو ....

جدول استاد:کلید اصلی :شماره استاد
فیلدها:نام استاد و.....

جدول کلاس:کلید اصلی کد کلاس
فیلدها :کد استادوکد درس و تاریخ و ساعت تشکیل و...

جدول انتخاب واحد :
کلید اصلی :ترکیب شماره دانشجویی و کد درس و...

جدول ثبت غیبت :
کد دانشجو و کد کلاس
فیلد تعداد غیبت و تاریخ غیبت و....


این یه مثال است و به عنوان یه بانک نرمال سازی شده 100%‌تلقی نمی شه
حتما موارد زیادی هست که باید اضافه کرد
کار کمی مشکل تر است اما با کمک view یا همون query می تونی به راحتی به اهدا خودت برسی

SYNDROME
سه شنبه 08 خرداد 1386, 10:56 صبح
با سلام

من می خواهم یک کویری انجام بدهم که دانشجویانی که بیشتر از سه غیبت دارند را نمایش بدهند ولی یک مشکلی که دارم این است که یک دانشجو ممکن است در چند کلاس شرکت کرده باشد.
من میخواهم اگر دانشجویی در چند کلاس شرکت کرده است غیبت های هر کلاس جداگانه نشان بده.غیبت های دانشجویانم در جدول hosor ثبت می شود که فیلدها:کددانشجویی که غیبت کرده است و تاریخ جلسه
ثبت نام دانشجویانم را در جدول ثبت نام است که فیلدها:کددانشجو-کد کلاس-کد استاد-کد درس
فیلد های کویری: کددانشجویی که غیبت کرده است - تاریخ جلسه-کد کلاس-کد استاد-کد درس
لطفا مرا راهنمایی کنید
خوب بر اساس کد درسو کد دانشجو جستجو کن اگر تعداد رکوردها بیشتر از حد مجاز بود پیغام بده.
البته یک فیلد کد دانشجو هم باید به Table دوم اضافه کنی.

rezvan_DP
سه شنبه 08 خرداد 1386, 11:07 صبح
به نظر من هم طراحی بانک شما مناسب نیست.
حداقل در جدول hosor باید کد کلاس رو هم داشته باشید وگرنه به چه صورت میخواهید متوجه شوید که فلان دانشجو در یک تاریخ مشخص در چه کلاسی غیبت داشته؟
بعد از این تصحیح همانطور که دوستان اشاره کردند می توانید بر اساس کد کلاس در جدول hosor جستجو نمایید .

hamidehsadat
پنج شنبه 24 خرداد 1386, 10:44 صبح
سلام به دوستان عزیز ممنون ازز اینکه وقتتان را در اختیار من قرار دادید و مشکلم را حل کردید.
ببخشید من یک سوال دارم من می خواهم یک گزارشی با rave درست کنم که لیست دانشجویان بیشتر از سه غیبت را نمایش بده من کدش را این طوری نوشتم و لیست دانشجویانی که بیشتر از سه غیبت را داشته باشند نمایش میدهد ولی یه مشکلی که دارم این است که این کد تعداد غیبت های یک دانشجو را نشان می دهد وتاریخ جلسه هایی که غیبت داشته است را نشان نمی دهد .وقتی در قسمت select فیلد Tarikhgalaseh را وارد میکنم تاریخ جلسه را نشان میدهد ولی در فیلد CountOfABSENT برای هر دانشجو یک میشود مثلا دانشجویی با کد 1 در کلاس 2 ثبت نام کرده است این دانشجو در این کلا س 2 تا غیبت داشته است( CountOfABSENT )وقتی در قسمت select فیلد Tarikhgalaseh را وارد میکنم به تعداد غیبت های دانشجو این کد تکرار میشودحالا من گزارشی که میخواهم بگیرم میخواهم تاریخ جلاسه هایی که غیبت داشته است را نشان بدهد ولی نمیدانم چه طوری کد دانشجویانی را بیشتر از سه غیبت داشته است را نشان بده.

SELECT hosor.Stid, hosor.Clid, COUNT( hosor.Tarikhgalaseh ) CountOfABSENT, hosor.Msid, hosor.Csid
FROM hosor
INNER JOIN "ghar.db" Ghar
ON (Ghar.Clid = hosor.Clid)
AND (Ghar.Stid = hosor.Stid)
AND (Ghar.Msid = hosor.Msid)
AND (Ghar.Csid = hosor.Csid)
WHERE hosor.Stid = hosor.Stid
GROUP BY hosor.Stid, hosor.Clid, hosor.Msid, hosor.Csid
HAVING (COUNT( hosor.Stid ) >= 3)

ghabil
پنج شنبه 24 خرداد 1386, 13:47 عصر
ببین نمیشه که بخوای توی یک سطر هم مجموع تمام عیبتها در هر کلاسی بیاد هم تاریخ تک تکشون ! ، تو وقتی گروه بندی میکنی اگر بر اساس تاریخ کلسهات باشه توی هر گروه فقط تعداد رکوردهای غیبت یک دانش آموز در یک تاریخ باقی میمونه که طبیعتا اگر باشه فقط 1 هست !

یکی از راه حلهات اینه که از یک ترکیب استفاده کنی مثلا :



Select Tarikh , stId, ...... from Table
where stId in
( SELECT hosor.Stid FROM hosor
INNER JOIN "ghar.db" Ghar
ON (Ghar.Clid = hosor.Clid)
AND (Ghar.Stid = hosor.Stid)
AND (Ghar.Msid = hosor.Msid)
AND (Ghar.Csid = hosor.Csid)
WHERE hosor.Stid = hosor.Stid
GROUP BY hosor.Stid, hosor.Clid, hosor.Msid, hosor.Csid
HAVING (COUNT( hosor.Stid ) >= 3)
)


یعنی اول آیدی اونایی که بیشتر از 3 تا غیبت داشتند رو پیدا کردیم حالا گفتیم تاریخ غیبتهای اینارو بده.
دقت کن داخل دستور In فقط آیدی رو برگردوندیم و بقیه اطلاعات روتوی جدول دوم میگیریم.

a_b_toops
پنج شنبه 24 خرداد 1386, 13:54 عصر
ببین نمیشه که بخوای توی یک سطر هم مجموع تمام عیبتها در هر کلاسی بیاد رو می شود بدست آورد


SELECT dbo.Moshakhast_danshjo.r, dbo.Moshakhast_danshjo.name, dbo.Moshakhast_danshjo.fam, dbo.Hozor_gheyab.code_k, SUM(dbo.Hozor_gheyab.Sate)
AS Sum_Class
FROM dbo.Hozor_gheyab RIGHT OUTER JOIN
dbo.Moshakhast_danshjo ON dbo.Hozor_gheyab.code_d = dbo.Moshakhast_danshjo.r
GROUP BY dbo.Moshakhast_danshjo.r, dbo.Moshakhast_danshjo.name, dbo.Moshakhast_danshjo.fam, dbo.Hozor_gheyab.code_k



code_k همان کد کلاس است
نکته اصلی در GROUP BY دو جدول می باشد
و فقط کافیه برای کد فرد فیلتر کنی بعد مجموع هر کلاسش رو بهت جدا می ده تست شده
در ضمن این فیلتر به بانک کلاسهای شما کاری ندارد و سرعت نسبتا خوبی دارد
موفق باشی

hamidehsadat
دوشنبه 28 خرداد 1386, 18:14 عصر
ببین نمیشه که بخوای توی یک سطر هم مجموع تمام عیبتها در هر کلاسی بیاد هم تاریخ تک تکشون ! ، تو وقتی گروه بندی میکنی اگر بر اساس تاریخ کلسهات باشه توی هر گروه فقط تعداد رکوردهای غیبت یک دانش آموز در یک تاریخ باقی میمونه که طبیعتا اگر باشه فقط 1 هست !

یکی از راه حلهات اینه که از یک ترکیب استفاده کنی مثلا :



Select Tarikh , stId, ...... from Table
where stId in
( SELECT hosor.Stid FROM hosor
INNER JOIN "ghar.db" Ghar
ON (Ghar.Clid = hosor.Clid)
AND (Ghar.Stid = hosor.Stid)
AND (Ghar.Msid = hosor.Msid)
AND (Ghar.Csid = hosor.Csid)
GROUP BY hosor.Stid, hosor.Clid, hosor.Msid, hosor.Csid
HAVING (COUNT( hosor.Stid ) >= 3)
)


یعنی اول آیدی اونایی که بیشتر از 3 تا غیبت داشتند رو پیدا کردیم حالا گفتیم تاریخ غیبتهای اینارو بده.
دقت کن داخل دستور In فقط آیدی رو برگردوندیم و بقیه اطلاعات روتوی جدول دوم میگیریم.ممنون از اینکه راهنمایی کردید. ولی یک مشکلی دارم اگر راهنمایی کنید ممنون میشم.
این کدی که شما گفتید من نوشتم ولی ارور invalid parameter می دهد

hamidehsadat
دوشنبه 28 خرداد 1386, 18:15 عصر
ببین نمیشه که بخوای توی یک سطر هم مجموع تمام عیبتها در هر کلاسی بیاد رو می شود بدست آورد


SELECT dbo.Moshakhast_danshjo.r, dbo.Moshakhast_danshjo.name, dbo.Moshakhast_danshjo.fam, dbo.Hozor_gheyab.code_k, SUM(dbo.Hozor_gheyab.Sate)
AS Sum_Class
FROM dbo.Hozor_gheyab RIGHT OUTER JOIN
dbo.Moshakhast_danshjo ON dbo.Hozor_gheyab.code_d = dbo.Moshakhast_danshjo.r
GROUP BY dbo.Moshakhast_danshjo.r, dbo.Moshakhast_danshjo.name, dbo.Moshakhast_danshjo.fam, dbo.Hozor_gheyab.code_k




code_k همان کد کلاس است نکته اصلی در GROUP BY دو جدول می باشد



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



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



موفق باشی


ممنون از اینکه مرا راهنمای کردید .
من چند تا سوال داشتم اگر جواب بدهید ممنون می شوم.
(dbo.Hozor_gheyab.Sate)AS Sum_Class :این قسمت چی را sum می کند.
فقط کافیه برای کد فرد فیلتر کنی:منظورتون از اینکه برای کد فرد فیلتر کنم برای چیه ؟

ghabil
دوشنبه 28 خرداد 1386, 20:21 عصر
ممنون از اینکه راهنمایی کردید. ولی یک مشکلی دارم اگر راهنمایی کنید ممنون میشم.
این کدی که شما گفتید من نوشتم ولی ارور invalid parameter می دهد

اون کدی که برات نوشتم از نظر ساختاری و مفهومی درست هست ، اما ممکنه یکجایی اسم یک فیلد غلط باشه یا اشتباه تایپ شده باشه ، دیگه خودت از این نظرها چکش کن.