اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
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
  • Foksh locked this topic
زائر
هذا الموضوع مغلق.
  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

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

Important Information