الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ماهو التعديل المطلوب لهذا الامر

بدأه الحلفاوي في 28 ديسمبر 2012 · 7 رد · 674 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

هذا الامر يعمل بشكل جيد لايجاد مدى الدرجات المحرزة للطلاب لفترة دراسية واحدة ولكن بالعلم ان هنالك فترتين يتم ايجاد المحصلة لها جميعاً فما التعديل المناسب في هذا الامر

علماً بان هنالك Column يسمى Term_ID ,والامرالذي بين ايديكم يعمل على اساس ان هذا الحقل اما يساوي 0 او يساوي 1 ولكن عند الامر الذي اريدكم مساعدتي فيه فسيتم تجاهل تحديد الفترة الدراسية Term_ID وايجاد محصلة الدرجات لكل طالب

برجاء الاستيضاح اكثر ان لم يكن الطرح واضحاً

اما الكود فها هو

 ALTER PROCEDURE [dbo].[Score_Ranges_All] 

	(
	@Year_name int=4 
--	@Subject int =0
	)

AS
	/* SET NOCOUNT ON */ 
	Begin
	SELECT  CASE 
                 WHEN Subject_Digree  < 50 THEN 'Subject_Digree ranged in < 50'
                 WHEN Subject_Digree  BETWEEN 50 AND 60 THEN 'Subject_Digree ranged in 50-60'
                 WHEN Subject_Digree  BETWEEN 60 AND 70 THEN 'Subject_Digree ranged in 60-70'
                 WHEN Subject_Digree  BETWEEN 70 AND 80 THEN 'Subject_Digree ranged in 70-80'
                 WHEN Subject_Digree  BETWEEN 80 AND 90 THEN 'Subject_Digree ranged in 80-90'
             ELSE 'Subject_Digree ranged in >=90'
        END AS Subject_Digree ,
        COUNT(*) AS [Total Students] ,Subject_name ,Year_name_Desc ,subject
FROM    dbo.General_set where  year_name = @year_name and Result_digree >=50
GROUP BY CASE 
--subject = @subject and
                WHEN Subject_Digree  < 50 THEN 'Subject_Digree ranged in < 50'
                 WHEN Subject_Digree  BETWEEN 50 AND 60 THEN 'Subject_Digree ranged in 50-60'
                 WHEN Subject_Digree  BETWEEN 60 AND 70 THEN 'Subject_Digree ranged in 60-70'
                 WHEN Subject_Digree  BETWEEN 70 AND 80 THEN 'Subject_Digree ranged in 70-80'
                 WHEN Subject_Digree  BETWEEN 80 AND 90 THEN 'Subject_Digree ranged in 80-90'
             ELSE 'Subject_Digree ranged in >=90'
         END ,Subject_name ,Year_name_Desc, subject order by subject
	End

جوزيتم خير

#2

السلام عليكم ورحمة الله وبركاته

أعتقد أنك تريد عمل حصر بعدد الطلاب الحاصلين على مدى معين فى كل مادة

بمعنى

عدد الطلاب الحاصلين على أقل من 50 فى المادة 1

عدد الطلاب الحاصلين على أقل من 50 فى المادة 2

عدد الطلاب الحاصلين على أقل من 50 فى المادة 3

عدد الطلاب الحاصلين على أقل من 50 فى المادة 4

عدد الطلاب الحاصلين على دجات من 50 : 60 فى المادة 1

عدد الطلاب الحاصلين على دجات من 50 : 60 فى المادة 2

عدد الطلاب الحاصلين على دجات من 50 : 60 فى المادة 3

عدد الطلاب الحاصلين على دجات من 50 : 60 فى المادة 4

وهكذا لباقى المدى، وربما تريد معرفة كل فصل دراسى على حده أيضاً

إذا كان ذلك كذلك فأعتقد أن الكود التالى يعمل جيداً بإذن الله

والطريقة هى...

عمل استعلام داخلى عن كل السجلات مع إضافة عمود يميز كل سجل (أى يحدد المدى الخاص به)

ثم بعد ذلك يتم عمل استعلام خارجى على هذا الاستعلام وفيه تتم عملية التجميع


SELECT Subject_Digree , COUNT(*) AS [Total Students] ,Subject_name ,Year_name_Desc ,subject, Term_ID
FROM
(
SELECT CASE WHEN Subject_Digree < 50 THEN 'Subject_Digree ranged in < 50'
WHEN Subject_Digree BETWEEN 50 AND 60 THEN 'Subject_Digree ranged in 50-60'
WHEN Subject_Digree BETWEEN 60 AND 70 THEN 'Subject_Digree ranged in 60-70'
WHEN Subject_Digree BETWEEN 70 AND 80 THEN 'Subject_Digree ranged in 70-80'
WHEN Subject_Digree BETWEEN 80 AND 90 THEN 'Subject_Digree ranged in 80-90'
ELSE 'Subject_Digree ranged in >=90'
END AS Subject_Digree , * FROM dbo.General_set
) as TempTable
group by
Subject_Digree , Subject_name ,Year_name_Desc ,subject, Term_ID

ولكن لى ملاحظة على خطأ منطقى بالشروط المستخدمة

وهو الخاص بأعداد العقود 60 و 70 و 80 حيث أنها ذكرت فى مكانين فيجب تحديد مكاناً واحداً لها

على سبيل المثال العدد 60 هل يتم وضعه تبع المدى من 50 إلى 60؟ أم تبع المدى من 60 إلى 70؟

لذلك يجب تعديل الشروط لتصبح مثلاً

WHEN Subject_Digree >= 50 AND Subject_Digree < 60 THEN 'Subject_Digree ranged in 50-60''

تم تعديل هذه المشاركة بواسطة ema2000_t في 28 ديسمبر 2012 في 16:01

5

أدعو الله أن يجعل أعمالنا خالصة لوجهه الكريم --- وأن ينفعنا بما علمنا

Dr Sayed Tohamy

Programming Instructor

مدرب برمجة

---------------

EmaSoft2000

-------------------

#3

السلام عليكم

ممتاز اخي ema2000_t وممتن على الاستجابة

هنالك شيئ لم اوضحه بشكل واضح وهو ان الدرجة الكلية للمادة للفترتين = 100 وذلك اذا كان Term_ID = 0 اي الفترة الاولى تكون الدرجة الكلية = 40 وفي الفترة الثانية اي عندما term_ID = 1 تكون الدرجة الكلية = 60

ما الذي اردته بالضبط هو كيفية حساب مجموع الدرجات للفترتين للطالب الواحد عندما كانت درجاته من 40 وعندما كانت درجاته من 60 باستعلام واحد ومن ثم اختبار مدى الدرجات كما في المثال اعلاه, او بعباره اخرى كيف

يمكنني استخدام الدالة SUM في هذه الحالة؟

مشكورين مأجورين

#4

السلام عليكم ورحمة الله وبركاته

ما فهمته أن درجات كل طالب مسجلة على عددة سجلات مثل النظرى العملى الشفوى وهكذا

وما تريده هو تجميع لهذه الدرجات

SELECT  Subject_Digree , COUNT(*) AS [Total Students] ,Subject_name ,Year_name_Desc ,subject, Term_ID
FROM
(
SELECT  CASE    WHEN Subject_Digree  < 50 THEN 'Subject_Digree ranged in < 50'
                WHEN Subject_Digree  BETWEEN 50 AND 60 THEN 'Subject_Digree ranged in 50-60'
                WHEN Subject_Digree  BETWEEN 60 AND 70 THEN 'Subject_Digree ranged in 60-70'
                WHEN Subject_Digree  BETWEEN 70 AND 80 THEN 'Subject_Digree ranged in 70-80'
                WHEN Subject_Digree  BETWEEN 80 AND 90 THEN 'Subject_Digree ranged in 80-90'
                ELSE 'Subject_Digree ranged in >=90'
        END AS Subject_Digree , *  FROM 
(
select sum(Subject_Digree) as Subject_Digree, * from dbo.General_set group by
Subject_Digree , Subject_name ,Year_name_Desc ,subject, Term_ID
) as SumDegree
) as TempTable
group by 
Subject_Digree , Subject_name ,Year_name_Desc ,subject, Term_ID

تم تعديل هذه المشاركة بواسطة ema2000_t في 29 ديسمبر 2012 في 22:25

7

أدعو الله أن يجعل أعمالنا خالصة لوجهه الكريم --- وأن ينفعنا بما علمنا

Dr Sayed Tohamy

Programming Instructor

مدرب برمجة

---------------

EmaSoft2000

-------------------

#5

السلام عليكم اشكرك جداً ولكن انظر الى هذا الخطأ "ولا اخفيك هذا الامر متقدم جداً " فليتك تكتشف الخطأ

 

Msg 8120, Level 16, State 1, Line 1
Column 'dbo.General_set.ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Msg 8156, Level 16, State 1, Line 1
The column 'subject_digree' was specified multiple times for 'SumDegree'.
Msg 8156, Level 16, State 1, Line 1
The column 'Subject_Digree' was specified multiple times for 'TempTable
''

 

اشكرك مرة اخرى

تم تعديل هذه المشاركة بواسطة الحلفاوي في 20 يناير 2013 في 16:13

#6

قد يفيد هذا الكود

SELECT  
		SubjectDigree1 , 
		Subject_name ,
		Year_name_Desc ,
		subject, 
		Term_ID,
		COUNT(*) AS [TotalStudents] 
FROM
		(
			SELECT  
					Subject_name ,
					Year_name_Desc ,
					subject, 
					Term_ID,
					CASE    WHEN SubjectDigree  < 50 THEN 'Subject_Digree ranged in < 50'
							WHEN SubjectDigree  BETWEEN 50 AND 60 THEN 'Subject_Digree ranged in 50-60'
							WHEN SubjectDigree  BETWEEN 60 AND 70 THEN 'Subject_Digree ranged in 60-70'
							WHEN SubjectDigree  BETWEEN 70 AND 80 THEN 'Subject_Digree ranged in 70-80'
							WHEN SubjectDigree  BETWEEN 80 AND 90 THEN 'Subject_Digree ranged in 80-90'
							ELSE 'Subject_Digree ranged in >=90' 	
					END AS SubjectDigree1					
			FROM 
					(
						select 					
								Subject_name ,
								Year_name_Desc ,
								subject, 
								Term_ID
								sum(Subject_Digree) as SubjectDigree
						from 
								dbo.General_set 
						group by
								Subject_name ,
								Year_name_Desc ,
								subject, 
								Term_ID
					) as SumDegree
		) as TempTable
group by 
		Subject_Digree1 , 
		Subject_name ,
		Year_name_Desc ,
		subject, 
		Term_ID
#7

السلام عليكم

الكود يعمل يا اخ كريم ولكن الحقل الذي اردته ان يعطي عدد الطلاب قيمته ثابته وللا تتغير في كل الصفوف وقيمته 1

 

فما التعديل المناسب

 

بوركتم

#8

ممكن توضح اكثر

مواضيع مشابهة