PDA

View Full Version : کمک برای سلکت RANK از یک جدول و اینسرت در یک ستون از همان جدول



asrah6
سه شنبه 07 آبان 1392, 03:16 صبح
سلام
من یک جدول به نام tblgrade برای ثبت نمرات دانش آموزان دارم که شامل فیلد های زیر است:
id به صورت خودکار شماره گذاری می شود
DID کد درس است که با جدول درسها رابطه دارد
TID کد ترم است که با جدول ترم ها رابطه دارد
IDSt شماره دانش آموز که با جدول مشخصات دانش آموزان رابطه دارد
Nomre نمره دانش آموز در درس مورد نظر می باشد
RANk برای ذخیره رتبه دانش آموز در درس مورد نظر در آن کلاس می باشد.
توسط عملیات اینسرت اطلاعات را از طریق فرم ویندوزی بدست آورده و در ستونهای DID,TID,IDSt,Nomre ذخیره می کنم در این قسمت داخل ستون RANK چیزی ذخیره نمی شود می خواهم بعد از عملیات اینسرت توسط یک سلکت به شکل زیر رتبه هر دانش آموز را در درس مورد نظر داخل کلاس مورد نظر بدست آورده وسپس در ستون RANK همین جدول ذخیره کنم به طوریکه برای هر دانش آموز با توجه به درس و کلاسش رتبه آن ذخیره شود تا در گزارش نمایش دهم.


select IDSt ,DID,TID,Nomre,DENSE_RANK() over (order by Nomre desc) as Rank2
from TblGrade
where TID=@TID AND DID=@DID

لطفا راهنمایی کنید چگونه اینکار را انجام دهم و چه کدی و در چه جایی بنویسم

sajadsobh
سه شنبه 07 آبان 1392, 14:44 عصر
این روشی که شما برای ranking در نظر گرفتین متغیره! یعنی با توجه به داده های موجود در فسمت نمرات صورت میگیره. به نظر من اگه قراره از این روش استفاده کنید اصلاً نیاز به فیلد Rank در جدول خودتون ندارید. فقط با استفاده از view بر روی فیلد نمره یه ranking صورت بدین و توی فیلد نمایش بدین. همین کاری که در کد بالا انجام دادین.

asrah6
سه شنبه 07 آبان 1392, 15:13 عصر
سلام و تشکر از پاسخ شما
نظر شما چیست ؟ راه حل دیگری برای این مورد دارید ؟

sajadsobh
سه شنبه 07 آبان 1392, 16:50 عصر
عرض کردم خدمتتون.
جدول رو بدون فیلد Rank طراحی کنید ولی موقعی که میخواین خروجی بگیرین با یه دستور select یا درست کردن یک view ، رتبه بندی رو هم انجام بدین.
id
DID
TID
IDSt
Nomre
رو واسه جدول در نظر بگیرین ولی موقعی که میخواین نشون بدین از این select استفاده کنید:

SELECT id, DID, TID, IDSt, Nomre, DENSE_RANK() OVER (ORDER BY Nomre) AS Ranking FROM Table_name

sajadsobh
سه شنبه 07 آبان 1392, 16:54 عصر
ولی اگه اگه منظورتون از رتبه بندی این باشه که مثلاً اینجوری باشه که از نمره 18 تا 20 درجه A باشه، از 14 تا 17 درجه B باشه و ... اینو میشه با یه دستور CASE ساده نوشت. اگه خواستین بگین براتون میزارم.

asrah6
چهارشنبه 08 آبان 1392, 21:42 عصر
سلام و تشکر از جنابعالی
میشه لطفا راهنمایی کنید چگونه با CASE این مورد را بنویسم

sajadsobh
پنج شنبه 09 آبان 1392, 22:55 عصر
خب یه مثال میزنم.
یه جدول با این فیلدها داریم:
ID
Name
Nomre
میخوام اونا که نمره شون بین 18 تا 20 درجه A باشند، اونا که 14 تا 17 هستند درجه B و الی آخر. کوئری رو اینجوری مینویسیم:

SELECT [Name], [Nomre],
CASE
WHEN [Nomre] BETWEEN 18 AND 20 THEN 'A'
WHEN [Nomre] BETWEEN 14 AND 17 THEN 'B'
WHEN [Nomre] BETWEEN 10 AND 13 THEN 'C'
WHEN [Nomre] BETWEEN 0 AND 9 THEN 'D'
END AS [Grade]
FROM MyTable

خروجی به این شکل در میاد:

http://upload7.ir/images/33556813507200224927.jpg

می بینید که ما فیلدی به اسم Grade که رتبه رو نشون بده نداشتیم ولی با دستور CASE توی خروجی اومدیم اونو نشون دادیم.