مثال لتوضيح الإشكال
عندي 03 جداول (1-جدول الزبون-2-جدول الديون-3-جدول المدفوعات)
الجدول الأول اسمه Client : فيه 03 حقول: Code_Client-Nom_Client
الجدول الثاني اسمه Credit: فيه 03 حقول: Code_Client-Montant_Credit-Date_Credit
الجدول الثالث اسمه Versement: فيه 03 حقول: Code_Client-Montant_Versement-Date_Versement
* إذا أردنا معرفة مجموع ديون كل زبون:
كود :
select Client.Code_Client , SUM(MonTant_Credit)
From Client , Credit
where Client.Code_Client=Credit.Code_Client
Group By Code_Client
* إذا أردنا معرفة مجموع مدفوعات كل زبون:
كود :
select Client.Code_Client , SUM(MonTant_Versement)
From Client , Versement
where Client.Code_Client=Versement.Code_Client
Group By Code_Client
*الإشكال ؟ : معرفة الإثنين: هذا الكود صحيحا برمجيا لكن يعطي نتائج خاطئة:
كود :
select Client.Code_Client , SUM(MonTant_Credit) , SUM(MonTant_Versement)
From Client , Credit , Versement
where (Client.Code_Client=Credit.Code_Client) and (Client.Code_Client=Versement.Code_Client)
Group By Code_Client
- ما هو الصواب؟ و إذا أردنا أيضا عرض الفارق بين الديون و المدفوعات في عمود مستقل أيضا ؟
السلام عليكم
هل الكود الاول و الثاني يعملان بشكل صحيح ؟ لأنه لا يوجد التعليمة join
حاول بالآتي:
PHP كود :
select Client.Code_Client , SUM(MonTant_Credit) , SUM(MonTant_Versement)
From Client INNER JOIN Credit on Client.Code_Client=Credit.Code_Client
INNER JOIN Versement on Client.Code_Client=Versement.Code_Client
Group By Versement.Code_Client
Lorsque GROUPBY existe, chaque champ simple dans les projecteurs doit être dans GROUPBY
(14-02-2017, 03:10 PM)nabilkeb كتب : [ -> ]Lorsque GROUPBY existe, chaque champ simple dans les projecteurs doit être dans GROUPBY
للتصحيح
,Client.Code_Client
عوضا عن
,Versement.Code_Client
بعد Group By
ورغم ذلك النتائج خاطئة نفس الإشكال
(14-02-2017, 05:04 PM)لؤي كتب : [ -> ]السلام عليكم
جرب هذا :
PHP كود :
select Client.Code_Client A , SUM(MonTant_Credit) B, SUM(MonTant_Versement) C
From Client INNER JOIN Credit on Client.Code_Client=Credit.Code_Client
INNER JOIN Versement on Client.Code_Client=Versement.Code_Client
Group By A,B,C
بارك الله فيك ، على الرد السريع و المساعدة ، لم أستوعب جيدا الكود لكن رسالة خطأ واردة
و لازال الإشكال قائما
لتوضيح الإشكال ، الكود المطروح أعلاه:
كود :
select Client.Code_Client , SUM(MonTant_Credit) , SUM(MonTant_Versement)
From Client , Credit , Versement
where (Client.Code_Client=Credit.Code_Client) and (Client.Code_Client=Versement.Code_Client)
Group By Code_Client
يعرض 3 أعمدة: كود الزبون - مجموع قيم الديون للزبون - مجموع قيم مدفوعات الزبون
عندما يكون للزبون سجل واحد في جدول الديون مثلا 18000دج ، وله أيضا 3 سجلات في جدول المدفوعات مثلا 300دج و سجل آخر 300دج ن وسجل ثالث 1400دج
من المفروض أن تكون نتيجة الإستعلام المذكور أعلاه هي: 18000دج ديون -7400 مدفوعات
لكن نتيجة الإستعلام هي: 54000دج ديون - 7400 مدفوعات ، يعني بما أن لديه 3 سجلات للمدفوعات تم جمعها 7400دج ، قام الإستعلام بـعملية : 18000+18000+18000دج و أعطى نتيجة 54000 ، وهذا خطأ
ما هو الإستعلام الصحيح؟
(14-02-2017, 05:34 PM)nabilkeb كتب : [ -> ]لتوضيح الإشكال ، الكود المطروح أعلاه:
كود :
select Client.Code_Client , SUM(MonTant_Credit) , SUM(MonTant_Versement)
From Client , Credit , Versement
where (Client.Code_Client=Credit.Code_Client) and (Client.Code_Client=Versement.Code_Client)
Group By Code_Client
يعرض 3 أعمدة: كود الزبون - مجموع قيم الديون للزبون - مجموع قيم مدفوعات الزبون
عندما يكون للزبون سجل واحد في جدول الديون مثلا 18000دج ، وله أيضا 3 سجلات في جدول المدفوعات مثلا 300دج و سجل آخر 300دج ن وسجل ثالث 1400دج
من المفروض أن تكون نتيجة الإستعلام المذكور أعلاه هي: 18000دج ديون -7400 مدفوعات
لكن نتيجة الإستعلام هي: 54000دج ديون - 7400 مدفوعات ، يعني بما أن لديه 3 سجلات للمدفوعات تم جمعها 7400دج ، قام الإستعلام بـعملية : 18000+18000+18000دج و أعطى نتيجة 54000 ، وهذا خطأ
ما هو الإستعلام الصحيح؟
عفوا 3000دج و ليس 300دج
(14-02-2017, 05:31 PM)لؤي كتب : [ -> ]جرب مع جدولين:
PHP كود :
select Client.Code_Client A , SUM(Credit.MonTant_Credit) B
From Client INNER JOIN Credit on Client.Code_Client=Credit.Code_Client
Group By A,B
مع جدولين (جدول الزبون-جدول الديون) أو (جدول الزبون-جدول المدفوعات) يعطي نتائج صحيحة
لكني أريد عرض الحالتين: مجموع الديون - مجموع المدفوعات ، ليتم بعد ذلك حساب الفارق بينهما (لعرض الديون الحالية أو الفعلية)
(14-02-2017, 05:34 PM)nabilkeb كتب : [ -> ]لتوضيح الإشكال ، الكود المطروح أعلاه:
كود :
select Client.Code_Client , SUM(MonTant_Credit) , SUM(MonTant_Versement)
From Client , Credit , Versement
where (Client.Code_Client=Credit.Code_Client) and (Client.Code_Client=Versement.Code_Client)
Group By Code_Client
يعرض 3 أعمدة: كود الزبون - مجموع قيم الديون للزبون - مجموع قيم مدفوعات الزبون
عندما يكون للزبون سجل واحد في جدول الديون مثلا 18000دج ، وله أيضا 3 سجلات في جدول المدفوعات مثلا 300دج و سجل آخر 300دج ن وسجل ثالث 1400دج
من المفروض أن تكون نتيجة الإستعلام المذكور أعلاه هي: 18000دج ديون -7400 مدفوعات
لكن نتيجة الإستعلام هي: 54000دج ديون - 7400 مدفوعات ، يعني بما أن لديه 3 سجلات للمدفوعات تم جمعها 7400دج ، قام الإستعلام بـعملية : 18000+18000+18000دج و أعطى نتيجة 54000 ، وهذا خطأ
ما هو الإستعلام الصحيح؟
(14-02-2017, 05:34 PM)nabilkeb كتب : [ -> ]لتوضيح الإشكال ، الكود المطروح أعلاه:
كود :
select Client.Code_Client , SUM(MonTant_Credit) , SUM(MonTant_Versement)
From Client , Credit , Versement
where (Client.Code_Client=Credit.Code_Client) and (Client.Code_Client=Versement.Code_Client)
Group By Code_Client
يعرض 3 أعمدة: كود الزبون - مجموع قيم الديون للزبون - مجموع قيم مدفوعات الزبون
عندما يكون للزبون سجل واحد في جدول الديون مثلا 18000دج ، وله أيضا 3 سجلات في جدول المدفوعات مثلا 300دج و سجل آخر 300دج ن وسجل ثالث 1400دج
من المفروض أن تكون نتيجة الإستعلام المذكور أعلاه هي: 18000دج ديون -7400 مدفوعات
لكن نتيجة الإستعلام هي: 54000دج ديون - 7400 مدفوعات ، يعني بما أن لديه 3 سجلات للمدفوعات تم جمعها 7400دج ، قام الإستعلام بـعملية : 18000+18000+18000دج و أعطى نتيجة 54000 ، وهذا خطأ
ما هو الإستعلام الصحيح؟
عفوا 3000دج و ليس 300دج
هل من رد أو مســــاعدة ؟؟؟
السلام عليكم ،
أخي نبيل بما أنك تستعمل Firebird على ما أظن ؟
لماذا لا تستخدم الحلقات في الإجراءات المخزنة Procedure stockée
مثال
كود :
For select Code_Client
FROM Client
Into LeCodeCli
DO
Begin
Select Sum(MonTant_Credit)
FROM Credit
Into TotCredit
Where (Credit.Code_Client = :LeCodeCli)
Select Sum(MonTant_Versement)
FROM Versement
Into TotVers
Where (Credit.Code_Client = :LeCodeCli)
LeSolde = TotCredit - TotVers
end
إذا تريد توضيح أكثر ، على العين و الراس.