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

كيف يمكن الحصول على البيانات المطلوبة من الجدولين بين تاريخين ؟

بدأه red_scorpion1 في 26 سبتمبر 2013 · 4 رد · 503 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

 

لدى ثلاثة جدول

 

1. Day_Off

 

اقتباس

 

[emplo_id] ,[day_date] ,[day_state] ,[day_work_hours] ,[part_time] ,[over_time] ,[all_day_hours]

 

2. Emplo_Data

 

اقتباس

 

[emplo_id],[emplo_name] ,[job_id] ,[Sat] ,[Sun] ,[Mon] ,[Tue] ,[Wed] ,[Thu] ,[agazat] ,[over_time_stock] ,[hours_target] ,[work_hours], [sallary], [day_work_mony] ,[hour_work_mony]

 

3. Emplo_Geza_Log

 

اقتباس

 

[geza_date] ,[geza_id],[emplo_id] ,[geza_mony]

 

ثم قمت بعمل إستعلام يقوم بحساب إجمالى عدد الساعات لكل موظف كذلك يقوم بحساب إجمالى عدد أيام الغياب والأجازات حسب نوعها والمأموريات لكل موظف على يكون الشكل النهائى فى النهاية هو ( سطر واحد لكل موظف يشمل جميع البيانات الشهرية الخاصة به )

 
SELECT      day_off.emplo_id, 
			emplo_data.emplo_name, 
			emplo_data.hours_target, 
			emplo_data.day_work_mony, 
			emplo_data.hour_work_mony, 
			emplo_data.sallary, 
			
			RIGHT('00' + LTRIM(STR(SUM(DATEDIFF(MINUTE, '00:00', CONVERT(time, day_off.all_day_hours, 8))) / 60)), 2) + ':' + RIGHT('00' + LTRIM(STR(SUM(DATEDIFF(MINUTE, '00:00', CONVERT(time, day_off.all_day_hours, 8))) % 60)), 2) AS Total_Hours, 

            COUNT(CASE WHEN day_off.day_state = N'مأمورية' THEN day_state END) AS مأمورية, 
            COUNT(CASE WHEN day_off.day_state = N'أجازة خاصة' THEN day_state END) AS [أجازة خاصة], 
            COUNT(CASE WHEN day_off.day_state = N'أجازة سنوية' THEN day_state END) AS [أجازة سنوية], 
            COUNT(CASE WHEN day_off.day_state = N'أجازة مرضية' THEN day_state END) AS [أجازة مرضية],
            COUNT(CASE WHEN day_off.day_state = N'أجازة زواج' THEN day_state END) AS [أجازة زواج], 
            COUNT(CASE WHEN day_off.day_state = N'أجازة عزاء' THEN day_state END) AS [أجازة عزاء],
            COUNT(CASE WHEN day_off.day_state = N'غياب بإذن' OR day_off.day_state = N'غياب بدون إذن' THEN day_off.day_state END) AS [يوم غياب], 
            CASE WHEN (SUM(CASE WHEN emplo_geza_log.geza_mony > 0 THEN emplo_geza_log.geza_mony END)) IS Null THEN '0' ELSE (SUM(CASE WHEN emplo_geza_log.geza_mony > 0 THEN emplo_geza_log.geza_mony END)) END AS [قيمة الجزاءات]
            
FROM        emplo_geza_log RIGHT OUTER JOIN day_off ON emplo_geza_log.emplo_id = day_off.emplo_id LEFT OUTER JOIN emplo_data ON day_off.emplo_id = emplo_data.emplo_id 

GROUP BY    emplo_data.emplo_name, emplo_data.hours_target, emplo_data.sallary, emplo_data.hour_work_mony, emplo_data.day_work_mony, day_off.emplo_id

           
ORDER BY    day_off.emplo_id

والأن تكمن المشكلة لدى فى الأتى

1. كيف يمكننى الحصول على البيانات من الإستعلام السابق ولكن بين تاريخين ( البيانات من day_off و emplo_geza_log ) تكون بين نفس التاريخين لأننى عندما أضيف حقل التاريخ day_off.day_date وحقل التاريخ فى الجدول الأخر emplo_geza_log.geza_date يحدث تكرار لإسم الموظف فى أكثر من سطر

تم تعديل هذه المشاركة بواسطة red_scorpion1 في 26 سبتمبر 2013 في 04:10

#2

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

 

ممكن تعمل الإستعلام ده جدول إستعلام بعدين تأخد منه البيانات المطلوبة بإستعلام جديد 

 

وممكن ترفق مثال  ؟؟

 

وشكراً

#3
arafat_system كتب:

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

 

ممكن تعمل الإستعلام ده جدول إستعلام بعدين تأخد منه البيانات المطلوبة بإستعلام جديد 

 

وممكن ترفق مثال  ؟؟

 

وشكراً

 

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

 

وما المثال المطلوب ؟ لقد ارفقت الكود المستخدم كاملا ؟

تم تعديل هذه المشاركة بواسطة red_scorpion1 في 26 سبتمبر 2013 في 09:50

#4
red_scorpion1 كتب:

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

سأفترض أن الاستعلام السابق يعمل جيداً ولكن ينقصه شرط التاريخ

 

أولا بالطبع لا يمكنك إظهار تواريخ الأجازات أو الجزاءات لأنك لو أظهرتها ستضطر لاستخدامها فى جملة Group by وبالتالى سيقوم بالتجميع بناء على اسم الموظف وأجر الساعة وكذلك تاريخ الإجازة وبالتالى فسوف يعرض لك أجازات مفصلة لكل موظف لأن تواريخها ليست واحدة وهذا مالا تريده

 

ولكن إذا أردت تنفيذ الاستعلام السابق وتحديد مدة معينة فاستخدم جملة where كما بالتعديل التالى

 

مع ملاحظة أنك ستغير بداية ونهاية المدة كما تريد، ولاحظ أيضاً أن تكون فى الصيغة شهر/يوم/سنة

SELECT      day_off.emplo_id, 
			emplo_data.emplo_name, 
			emplo_data.hours_target, 
			emplo_data.day_work_mony, 
			emplo_data.hour_work_mony, 
			emplo_data.sallary, 
			
			RIGHT('00' + LTRIM(STR(SUM(DATEDIFF(MINUTE, '00:00', CONVERT(time, day_off.all_day_hours, 8))) / 60)), 2) + ':' + RIGHT('00' + LTRIM(STR(SUM(DATEDIFF(MINUTE, '00:00', CONVERT(time, day_off.all_day_hours, 8))) % 60)), 2) AS Total_Hours, 

            COUNT(CASE WHEN day_off.day_state = N'مأمورية' THEN day_state END) AS مأمورية, 
            COUNT(CASE WHEN day_off.day_state = N'أجازة خاصة' THEN day_state END) AS [أجازة خاصة], 
            COUNT(CASE WHEN day_off.day_state = N'أجازة سنوية' THEN day_state END) AS [أجازة سنوية], 
            COUNT(CASE WHEN day_off.day_state = N'أجازة مرضية' THEN day_state END) AS [أجازة مرضية],
            COUNT(CASE WHEN day_off.day_state = N'أجازة زواج' THEN day_state END) AS [أجازة زواج], 
            COUNT(CASE WHEN day_off.day_state = N'أجازة عزاء' THEN day_state END) AS [أجازة عزاء],
            COUNT(CASE WHEN day_off.day_state = N'غياب بإذن' OR day_off.day_state = N'غياب بدون إذن' THEN day_off.day_state END) AS [يوم غياب], 
            CASE WHEN (SUM(CASE WHEN emplo_geza_log.geza_mony > 0 THEN emplo_geza_log.geza_mony END)) IS Null THEN '0' ELSE (SUM(CASE WHEN emplo_geza_log.geza_mony > 0 THEN emplo_geza_log.geza_mony END)) END AS [قيمة الجزاءات]
            
FROM        emplo_geza_log RIGHT OUTER JOIN day_off ON emplo_geza_log.emplo_id = day_off.emplo_id LEFT OUTER JOIN emplo_data ON day_off.emplo_id = emplo_data.emplo_id 

where day_off.day_date between '1/1/2013' and '5/1/2013'
and
emplo_geza_log.geza_date between '1/1/2013' and '5/1/2013'

GROUP BY    emplo_data.emplo_name, emplo_data.hours_target, emplo_data.sallary, emplo_data.hour_work_mony, emplo_data.day_work_mony, day_off.emplo_id

           
ORDER BY    day_off.emplo_id

أرجو من الله أن يفيد هذا

تم تعديل هذه المشاركة بواسطة ema2000_t في 26 سبتمبر 2013 في 15:05

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

Dr Sayed Tohamy

Programming Instructor

مدرب برمجة

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

EmaSoft2000

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

#5
ema2000_t كتب:

ولكن هناك خطأ ربما يظهر لك بسبب أمر الربط حيث أنه لن يعرض لك الموظف إذا لم يكن عنده أجازات لأنك تستخدم Right join فعند محاولة ربط أجازات الموظف بجزاءاته لن تنتج أى نتائج إلا إذا كان عنده أجازات

لذلك أرجو أن تجرب لموظف ليس له أجازات وله جزاءات فإذا ظهر الخطأ ربما تغير سطر الربط إلى اتالى

FROM        emplo_geza_log RIGHT OUTER JOIN day_off ON emplo_geza_log.emplo_id = emplo_data.emplo_id RIGHT OUTER JOIN emplo_data ON day_off.emplo_id = emplo_data.emplo_id

أرجو من الله أن يفيد هذا

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

Dr Sayed Tohamy

Programming Instructor

مدرب برمجة

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

EmaSoft2000

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…