اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

الردود الموصى بها

قام بنشر

أريد استخراج الطلبــة العشرة الأوائل في استعلام Q_Top10_ByClass
مع ملاحظة تكرار الترتيب
علماً بأنه ثم إنشاء مديول لاحتساب الأوائل؛ ولكن لم أعرف كيف استدعيها في الاستعلام

 

Data_Base.rar

قام بنشر

بدايةً ، وعليكم السلام ورحمة الله وبركاته ..

لديك نقطة واحد فقط كان عليك إدراكها . وهي إضافة الحقل ClassID من الجدول F ، وجعل الشرط [أدخل اسم الصف] له وليس للحقل ClassName من الجدول S . قبل تجربة المرفق ، جرب دون النظر للمرفق حتى تفهم المقصود من كلامي ..

 

مع العلم أن ملفك يعمل معي بشكل سليم باستخراج الأوائل . إلا إن كان هناك نقطة لم تتوضح في شرحك 😀

 

Data_Base.zip

قام بنشر

اهاااا ، بعد متابعة النتيجة ، وجدت أنه يأتيك بجميع الطلاب للفصل الأول والصف الثامن وعددهم 16 على سبيل المثال .. وأنت تريد فقط 10 :biggrin:

جرب هذا الإستعلام التالي :-

SELECT TOP 10 S.StudentID, S.StudentName, S.ClassName, S.SETNO1, F.SemesterID, F.TotalSum, F.average, F.Grade, (
      SELECT COUNT(*)
      FROM TBL_Final1 AS F2
      INNER JOIN TBL_Students AS S2 
      ON F2.StudentID = S2.StudentID
      WHERE 
          F2.SemesterID = F.SemesterID
          AND S2.ClassName = S.ClassName
          AND F2.average > F.average
    ) + 1 AS RankOrder
FROM TBL_Students AS S INNER JOIN TBL_Final1 AS F ON S.StudentID = F.StudentID
WHERE F.SemesterID = [أدخل رقم الفصل]
    AND S.ClassName = [أدخل اسم الصف]
ORDER BY F.average DESC, S.StudentID ASC; 

 

  • Like 1
قام بنشر (معدل)
2 ساعات مضت, Foksh said:

اهاااا ، بعد متابعة النتيجة ، وجدت أنه يأتيك بجميع الطلاب للفصل الأول والصف الثامن وعددهم 16 على سبيل المثال .. وأنت تريد فقط 10 :biggrin:

جرب هذا الإستعلام التالي :-

SELECT TOP 10 S.StudentID, S.StudentName, S.ClassName, S.SETNO1, F.SemesterID, F.TotalSum, F.average, F.Grade, (
      SELECT COUNT(*)
      FROM TBL_Final1 AS F2
      INNER JOIN TBL_Students AS S2 
      ON F2.StudentID = S2.StudentID
      WHERE 
          F2.SemesterID = F.SemesterID
          AND S2.ClassName = S.ClassName
          AND F2.average > F.average
    ) + 1 AS RankOrder
FROM TBL_Students AS S INNER JOIN TBL_Final1 AS F ON S.StudentID = F.StudentID
WHERE F.SemesterID = [أدخل رقم الفصل]
    AND S.ClassName = [أدخل اسم الصف]
ORDER BY F.average DESC, S.StudentID ASC; 

بارك الله فيك وجزاك الله خيرا على حسن اهتمامك بالموضوع وردك الطيب الجميل

ويجعلك من عتقائه من النار في هذا الشهر المبارك

ولدي عدة ملحوظات وهى:

1/ مشكلة القفز في الترتيب ولو تلاحظ أن الترتيب يظهر هكذا

1

2

3

4

4

6

والمفروض يظهر

4

4 متكرر

5

6

وهكذا

2/ أتمنى تغيير المسميات إلى نص أقصد بدلا من 1.2.3 وهكذا أريده أن يكون:

الأول

الثاني

الثالث

إلى الترتيب العاشر

3/ ملاحظة تكرار الترتيب بحيث يكون مثلا:

الأول

الأول متكرر

وهكذا

تم تعديل بواسطه omran2015
قام بنشر
SELECT TOP 10 
    S.StudentID, 
    S.StudentName, 
    S.ClassName, 
    S.SETNO1, 
    F.SemesterID, 
    F.TotalSum, 
    F.average, 
    F.Grade,

    /* الترتيب الصحيح بدون قفزات */
    (SELECT COUNT(DISTINCT F2.average)
     FROM TBL_Final1 AS F2
     INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
     WHERE F2.SemesterID = F.SemesterID
       AND S2.ClassName = S.ClassName
       AND F2.average > F.average
    ) + 1 AS RankOrder,

    /* تحويل الرقم إلى نص */
    Switch(
      (SELECT COUNT(DISTINCT F2.average)
       FROM TBL_Final1 AS F2
       INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
       WHERE F2.SemesterID = F.SemesterID
         AND S2.ClassName = S.ClassName
         AND F2.average > F.average
      ) + 1 = 1, "الأول",
      (SELECT COUNT(DISTINCT F2.average)
       FROM TBL_Final1 AS F2
       INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
       WHERE F2.SemesterID = F.SemesterID
         AND S2.ClassName = S.ClassName
         AND F2.average > F.average
      ) + 1 = 2, "الثاني",
      (SELECT COUNT(DISTINCT F2.average)
       FROM TBL_Final1 AS F2
       INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
       WHERE F2.SemesterID = F.SemesterID
         AND S2.ClassName = S.ClassName
         AND F2.average > F.average
      ) + 1 = 3, "الثالث",
      (SELECT COUNT(DISTINCT F2.average)
       FROM TBL_Final1 AS F2
       INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
       WHERE F2.SemesterID = F.SemesterID
         AND S2.ClassName = S.ClassName
         AND F2.average > F.average
      ) + 1 = 4, "الرابع",
      (SELECT COUNT(DISTINCT F2.average)
       FROM TBL_Final1 AS F2
       INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
       WHERE F2.SemesterID = F.SemesterID
         AND S2.ClassName = S.ClassName
         AND F2.average > F.average
      ) + 1 = 5, "الخامس",
      (SELECT COUNT(DISTINCT F2.average)
       FROM TBL_Final1 AS F2
       INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
       WHERE F2.SemesterID = F.SemesterID
         AND S2.ClassName = S.ClassName
         AND F2.average > F.average
      ) + 1 = 6, "السادس",
      (SELECT COUNT(DISTINCT F2.average)
       FROM TBL_Final1 AS F2
       INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
       WHERE F2.SemesterID = F.SemesterID
         AND S2.ClassName = S.ClassName
         AND F2.average > F.average
      ) + 1 = 7, "السابع",
      (SELECT COUNT(DISTINCT F2.average)
       FROM TBL_Final1 AS F2
       INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
       WHERE F2.SemesterID = F.SemesterID
         AND S2.ClassName = S.ClassName
         AND F2.average > F.average
      ) + 1 = 8, "الثامن",
      (SELECT COUNT(DISTINCT F2.average)
       FROM TBL_Final1 AS F2
       INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
       WHERE F2.SemesterID = F.SemesterID
         AND S2.ClassName = S.ClassName
         AND F2.average > F.average
      ) + 1 = 9, "التاسع",
      (SELECT COUNT(DISTINCT F2.average)
       FROM TBL_Final1 AS F2
       INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
       WHERE F2.SemesterID = F.SemesterID
         AND S2.ClassName = S.ClassName
         AND F2.average > F.average
      ) + 1 = 10, "العاشر"
    ) AS RankText,

    /* إضافة كلمة "متكرر" عند وجود أكثر من طالب بنفس المعدل */
    Switch(
      (SELECT COUNT(DISTINCT F2.average)
       FROM TBL_Final1 AS F2
       INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
       WHERE F2.SemesterID = F.SemesterID
         AND S2.ClassName = S.ClassName
         AND F2.average > F.average
      ) + 1 = 1, "الأول",
      (SELECT COUNT(DISTINCT F2.average)
       FROM TBL_Final1 AS F2
       INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
       WHERE F2.SemesterID = F.SemesterID
         AND S2.ClassName = S.ClassName
         AND F2.average > F.average
      ) + 1 = 2, "الثاني",
      (SELECT COUNT(DISTINCT F2.average)
       FROM TBL_Final1 AS F2
       INNER JOIN TBL_Students AS S2 ON F2.StudentID = S2.StudentID
       WHERE F2.SemesterID = F.SemesterID
         AND S2.ClassName = S.ClassName
         AND F2.average > F.average
      ) + 1 = 3, "الثالث"
    ) & IIf(
      (SELECT COUNT(*) 
       FROM TBL_Final1 AS F3 
       WHERE F3.SemesterID = F.SemesterID 
         AND F3.average = F.average) > 1,
      " متكرر",
      ""
    ) AS RankFinal

FROM TBL_Students AS S 
INNER JOIN TBL_Final1 AS F ON S.StudentID = F.StudentID
WHERE F.SemesterID = [أدخل رقم الفصل]
  AND S.ClassName = [أدخل اسم الصف]
ORDER BY F.average DESC, S.StudentID ASC;

 

قام بنشر
4 ساعات مضت, omran2015 said:

ولدي عدة ملحوظات وهى:

1/ مشكلة القفز في الترتيب ولو تلاحظ أن الترتيب يظهر هكذا

بسيطة أخي الكريم ..

 

يعني انت تريد إظهار الطلاب الذين في المركز الرابع مثلاً جميعهم بالتمييز بينهم ( متكرر ) !!!!!!!

انا لم أقترب من الدالة التي قمت بإنشائها ، حرصاً على أنه قد يكون مطلبك .. لكن بعد التوضيح ، إليك التعديل الذي تم على الدالتين أولاً :-

Public Function fncTrteeb()
    Dim rst As Object
    Dim RankNumber As Long
    
    ' تصفير الحقل أولاً
    CurrentDb.Execute "UPDATE Q_top10 SET trteeb = Null"
    
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM Q_top10 ORDER BY average DESC, StudentID ASC", 2)
    
    If rst.RecordCount = 0 Then Exit Function
    
    rst.MoveFirst
    RankNumber = 0
    
    Do While Not rst.EOF And RankNumber < 10
        RankNumber = RankNumber + 1
        
        rst.Edit
        rst!trteeb = GetArabicRank(RankNumber)
        rst.Update
        
        rst.MoveNext
    Loop
    
    rst.Close
    Set rst = Nothing
End Function

Public Function GetArabicRank(ByVal n As Long) As String
    Select Case n
        Case 1: GetArabicRank = "الأول"
        Case 2: GetArabicRank = "الثاني"
        Case 3: GetArabicRank = "الثالث"
        Case 4: GetArabicRank = "الرابع"
        Case 5: GetArabicRank = "الخامس"
        Case 6: GetArabicRank = "السادس"
        Case 7: GetArabicRank = "السابع"
        Case 8: GetArabicRank = "الثامن"
        Case 9: GetArabicRank = "التاسع"
        Case 10: GetArabicRank = "العاشر"
        Case Else
            GetArabicRank = "المركز " & n
    End Select
End Function

 

والإستعلام سيصبح بهذاالشكل :-

SELECT TOP 10 S.StudentID, S.StudentName, S.ClassName, S.SETNO1, F.SemesterID, F.TotalSum, F.average, F.Grade, GetArabicRank((
      SELECT COUNT(*)
      FROM TBL_Final1 AS F2
      INNER JOIN TBL_Students AS S2 
      ON F2.StudentID = S2.StudentID
      WHERE 
          F2.SemesterID = F.SemesterID
          AND S2.ClassName = S.ClassName
          AND (F2.average > F.average 
               OR (F2.average = F.average AND S2.StudentID < S.StudentID))
    ) + 1) AS RankText
FROM TBL_Students AS S INNER JOIN TBL_Final1 AS F ON S.StudentID = F.StudentID
WHERE F.SemesterID = [أدخل رقم الفصل]
    AND S.ClassName = [أدخل اسم الصف]
ORDER BY F.average DESC , S.StudentID;

 

في الاستعلام القديم كان المنطق هو ( احسب كم طالب معدله أكبر مني ) ؟؟

فإذا كان هناك طالبان معدلهما متساوٍ ( مثلاً 91% ) ، فإن كلاهما سيجد نفس العدد كترتيب من الطلاب المتفوقين عليهما ، وبالتالي يأخذان نفس الرقم ( مثلاً المركز 2 ) ، ثم يقفز الترتيب للمركز 4 مباشرة .

أما في الاستعلام المعدل ، إذا تساوى طالبان في المعدل ، انظر لرقم الطالب ؛ صاحب الرقم الأصغر يعتبر هو الأسبق .

:excl: وبالنسبة لي هذا غير منطقي ، فلا بد من شرط ثاني لتحديد المنافس على نفس المركز !!!!

 

💥 وفي هذا الموضوع هنا ، قد تطرقنا مع مشاركة أخي @ابو جودي لنفس الفكرة تقريباً .

 

وملفك بعد التعديل :-

Data_Base.zip

  • تمت الإجابة
قام بنشر

وهذه فكرة تجمع بين عرض التكرارات التي يتنافس فيها الطلاب حسب رغبتك ..

Data_Base_Rep.zip

  • Like 1
قام بنشر
الان, Foksh said:

وهذه فكرة تجمع بين عرض التكرارات التي يتنافس فيها الطلاب حسب رغبتك ..

Data_Base_Rep.zip 85.83 kB · 0 downloads

فعلاً هذا هو المطلوب بارك الله فيك
مع شكري وتقديري للأساتذة الكرام الذين كانوا لهم دورٌ بارزٌ في المساعدة والتوجيه

  • Thanks 1

انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من اضافه تعليق جديد

يجب ان تكون عضوا لدينا لتتمكن من التعليق

انشئ حساب جديد

سجل حسابك الجديد لدينا في الموقع بمنتهي السهوله .

سجل حساب جديد

تسجيل دخول

هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.

سجل دخولك الان
  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information