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

تجميع فواتير عميل بدون التكرار

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

عندي جدولين العملاء .Cust_Def  ,والاخر  جدول فواتير العملاء INV_Header

اريد عمل استعلام يقوم بتجميع اسعار فواتير حسب كل عميل خلال فترة معينه حتى استطيع معرفة افضل عميل بالشركة بحيث كل صف في الاستعلام يحتوي على اسم العميل وهاتفه ومجموع فواتيرة خلال الفترة 

 

مع العلم لا يمكنني التعديل على الجداول ولا توجد علاقات بين الجداول في قاعدة البيانات ولا مفاتيح اساسية كما ان لكل عميل عدة فواتير ... أعمل على sql 2000

استخدمت distinct لكن يقوم الاستعلام المرفق باظهار بعض العملاء بدون تجميع فواتيرهم ويتكرر العميل في الصفوف 

SELECT DISTINCT 
                      TOP 100 PERCENT dbo.Cust_Def.Cust_Phone0, SUM(dbo.INV_Header.INV_Payed_Price) AS Total, dbo.Cust_Def.Cust_No, 
                      dbo.INV_Header.Inv_Cust_name, dbo.INV_Header.Inv_R_Date
FROM         dbo.INV_Header INNER JOIN
                      dbo.Cust_Def ON dbo.INV_Header.Inv_Cust_no = dbo.Cust_Def.Cust_ID
WHERE     (dbo.INV_Header.Inv_No_Old = '0') AND (dbo.INV_Header.Inv_R_Date BETWEEN CONVERT(DATETIME, '2014-04-01 00:00:00', 102) AND 
                      CONVERT(DATETIME, '2014-04-30 00:00:00', 102))
GROUP BY dbo.Cust_Def.Cust_Phone0, dbo.Cust_Def.Cust_No, dbo.INV_Header.Inv_Cust_name, dbo.INV_Header.Inv_R_Date
ORDER BY SUM(dbo.INV_Header.INV_Payed_Price) DESC

inv_r_date هو حقل تاريخ الفاتوره في الجدول 

INV_Payed_Price حقل اجمالي سعر الفاتورة

Cust_No هو حقل رقم العميل

#2

اين الردود ؟ !!

#3

جملة Group By يأتي معها Having  وليس Where

 

جرب التالي 

SELECT DISTINCT 
TOP 100 PERCENT dbo.Cust_Def.Cust_Phone0, SUM(dbo.INV_Header.INV_Payed_Price) AS Total, dbo.Cust_Def.Cust_No,
dbo.INV_Header.Inv_Cust_name, dbo.INV_Header.Inv_R_Date
FROM dbo.INV_Header INNER JOIN
dbo.Cust_Def ON dbo.INV_Header.Inv_Cust_no = dbo.Cust_Def.Cust_ID
GROUP BY dbo.Cust_Def.Cust_Phone0, dbo.Cust_Def.Cust_No, dbo.INV_Header.Inv_Cust_name, dbo.INV_Header.Inv_R_Date
HAVING (dbo.INV_Header.Inv_No_Old = '0') AND (dbo.INV_Header.Inv_R_Date BETWEEN CONVERT(DATETIME, '2014-04-01 00:00:00', 102) AND 
CONVERT(DATETIME, '2014-04-30 00:00:00', 102))
ORDER BY SUM(dbo.INV_Header.INV_Payed_Price) DESC
#4

ماذال التكرار موجود  :( 

في البداية اظهر رسالة خطأ ثم عدلت الكود ليصبح كالتالي لكن دون جدوى

SELECT DISTINCT 
                      TOP 100 PERCENT dbo.Cust_Def.Cust_Phone0, SUM(dbo.INV_Header.INV_Payed_Price) AS Total, dbo.Cust_Def.Cust_No, 
                      dbo.INV_Header.Inv_Cust_name, dbo.INV_Header.Inv_R_Date, dbo.INV_Header.Inv_No_Old
FROM         dbo.INV_Header INNER JOIN
                      dbo.Cust_Def ON dbo.INV_Header.Inv_Cust_no = dbo.Cust_Def.Cust_ID
GROUP BY dbo.Cust_Def.Cust_Phone0, dbo.Cust_Def.Cust_No, dbo.INV_Header.Inv_Cust_name, dbo.INV_Header.Inv_R_Date, 
                      dbo.INV_Header.Inv_No_Old
HAVING      (dbo.INV_Header.Inv_R_Date BETWEEN CONVERT(DATETIME, '2014-04-01 00:00:00', 102) AND CONVERT(DATETIME, '2014-04-30 00:00:00', 102)) 
                      AND (dbo.INV_Header.Inv_No_Old = ' 0')
ORDER BY SUM(dbo.INV_Header.INV_Payed_Price) DESC
#5

لقد وجدت الحل ولله الحمد   :D  :D  :D 

SELECT DISTINCT 
                      TOP 100 PERCENT dbo.Cust_Def.Cust_Phone0, SUM(dbo.INV_Header.INV_Payed_Price) AS Total, dbo.Cust_Def.Cust_No, 
                      dbo.INV_Header.Inv_Cust_name
FROM         dbo.INV_Header INNER JOIN
                      dbo.Cust_Def ON dbo.INV_Header.Inv_Cust_no = dbo.Cust_Def.Cust_ID
WHERE     (dbo.INV_Header.Inv_R_Date BETWEEN CONVERT(DATETIME, '2014-04-01 00:00:00', 102) AND CONVERT(DATETIME, '2014-04-10 00:00:00', 102)) 
                     'AND (dbo.INV_Header.Inv_No_Old = '0')
GROUP BY dbo.Cust_Def.Cust_Phone0, dbo.Cust_Def.Cust_No, dbo.INV_Header.Inv_Cust_name
ORDER BY SUM(dbo.INV_Header.INV_Payed_Price) DESC

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

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

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

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

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