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

مشكلة في جملة إستعلام بواسطة الـ Group bY

بدأه dot.net2008 في 18 أغسطس 2011 · 23 رد · 1,773 مشاهدة · في قواعد بيانات MySQL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

يوجد في قاعدة البيانات لدي جدول بإسم dists وهو جدول لوضع أسماء الموزعيين

ويوجد به الحقول التالية :

id ترقيم تلقائي

إسم الموزع << dist_name

القيمة >> dist_value

dist_active << مفعّلة أو غير مفعلة (bool)

أريد من الإستعلام أن يقوم بما يلي ..

1جلب إسم الموزع و مجموع القيم الخاصة به و مجموع القيم التي قيمة الحقل في نفس السجل active = 1

وشكراً

#2

لم أفهم فصدك أخي الكريم

هل تريد المجموع من أجل كل موزع و في حقل آخر تريد المجموع "للتوزبعات" الفعالة فقط؟

أي إذا كان لدى أحد الموزعين 5 سجلات ثلاثة منها لديها قيمة active=1 فأنت تريد النتيجة كالتالي:

name1 | 5 | 3

??

تم تعديل هذه المشاركة بواسطة byte101 في 18 أغسطس 2011 في 12:31

لاتـُهيئ كفني ما متّ بعد = لم يزل في أضلعي برقٌ و رعدُ


أنــا اسـلامــي ..أنا عزّته = أنا خيل الله نحو النصــر تعــدو


أنــا تــاريـخـي …ألا تعــرفـه = خـالد ينبض في روحــي و سعدُ


لاتـــغرنـك منــي هدأتـــــي = لا يمــوت الثــأر و لــكن يســتعـدُ


لا يغرنـــك نصــلٌ موغـــلٌ = في عروقي …فـأنا منه أحـّـــدُ


إن ما ضُيع في ساح الوغى = في سوى ساحــاتـها لا يــستردُ


#3

نعم أخي الكريم هذا الذي اريده بالضبط :)

#4

تفضل أخي الكريم

select a.dist_name,a.val1,b.val1 from

(

select dist_name, sum( dist_value) as val1 from dists

group by dist_name

)

as a

inner join

(

select dist_name, sum( dist_value) as val1 from dists where dist_active=1

group by dist_name

)

as b

on a.dist_name=b.dist_name

أخوك أبو عمر

تم تعديل هذه المشاركة بواسطة byte101 في 18 أغسطس 2011 في 22:49

2

لاتـُهيئ كفني ما متّ بعد = لم يزل في أضلعي برقٌ و رعدُ


أنــا اسـلامــي ..أنا عزّته = أنا خيل الله نحو النصــر تعــدو


أنــا تــاريـخـي …ألا تعــرفـه = خـالد ينبض في روحــي و سعدُ


لاتـــغرنـك منــي هدأتـــــي = لا يمــوت الثــأر و لــكن يســتعـدُ


لا يغرنـــك نصــلٌ موغـــلٌ = في عروقي …فـأنا منه أحـّـــدُ


إن ما ضُيع في ساح الوغى = في سوى ساحــاتـها لا يــستردُ


#5

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

طريقة الأخ أبو عمر تؤدي المطلوب و يستحق عليها +1 :)

لكن أحببت الإشارة إلى طريقة أخرى:

SELECT `dist_name` , sum( `dist_value` ) AllDist, Sum( IF( `dist_active` =1, `dist_value` , 0 ) ) ActiveDist
FROM `dists`
GROUP BY `dist_name`

بتوفيق الله...

1

Everything will be fine when we TALK LESS, DO MORE


#6

يعطيكم العافية ولكن هل للتعليمة Having أي تسهيل في الكود التالي ,,

سأقوم بتجريب الإستعلامات التالية وأكتب النتيجة :)

#7

مشكور على المرور أخ محمد

أفدتني جزاك الله خيرا

لاتـُهيئ كفني ما متّ بعد = لم يزل في أضلعي برقٌ و رعدُ


أنــا اسـلامــي ..أنا عزّته = أنا خيل الله نحو النصــر تعــدو


أنــا تــاريـخـي …ألا تعــرفـه = خـالد ينبض في روحــي و سعدُ


لاتـــغرنـك منــي هدأتـــــي = لا يمــوت الثــأر و لــكن يســتعـدُ


لا يغرنـــك نصــلٌ موغـــلٌ = في عروقي …فـأنا منه أحـّـــدُ


إن ما ضُيع في ساح الوغى = في سوى ساحــاتـها لا يــستردُ


#8

بارك الله بكم جميعاً وجزاكم عنا كل خير

#9

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

واجهت مشكلة في طريقة كتابة الإستعلام بشكله الكلي

لدي الجدول التالي الذي يوجد به الحقول التالية

post-220002-075742400 1313764506_thumb.j

قمت بكتابة إستعلام ليجلب لي إسم الموزع وعدد مرات توزيعه وعدد التوزيعات المفعلة وعدد التوزيعات غير المفعلة

فقمت بكتابة الإستعلام التالي

select distinct a.dist_name,a.count_all,b.count_active,c.count_not_active from
(
select dist_name,count(*) as count_all from dists 
group by dist_name
)
as a
inner join
(
select dist_name,count(*) as count_active from dists  where active=1
group by dist_name
)
as b
inner join
(
select dist_name,count(*) as count_not_active from dists where active=0
group by dist_name
)
as c
on a.dist_name=b.dist_name=c.dist_name group by dist_name

وعند تنفيذ الإستعلام ظهرت لي النتيجة التالية

post-220002-009995100 1313764509_thumb.j

وكما تلاحظون الموزع abdo يمتلك 4 سجلات مبيعات (سجل مفعل , و3 سجلات غير مفعلة) صحيح

اما الموزعان (ali,ayman) كل منهما يمتلك سجلان للمبيعات (سجل مفعل , و 3 سجلات غير مفعلة) خطأ

يجب أن يكون (سجل مفعل و سجل غير مفعل) هذا الصحيح ,,

ارجوا ان تكون قد وضحت الفكرة ...

المرفقات
1.JPG2.JPG
#10

السلام عليكم

أنا آسف لأنني لا أستطيع إعطائك جواب حاسم لأنني أواجه بعض المشاكل التقنية على جهازي و لكن أرجو منك أن تحاول حذف عبارة group by الأخيرة

لاتـُهيئ كفني ما متّ بعد = لم يزل في أضلعي برقٌ و رعدُ


أنــا اسـلامــي ..أنا عزّته = أنا خيل الله نحو النصــر تعــدو


أنــا تــاريـخـي …ألا تعــرفـه = خـالد ينبض في روحــي و سعدُ


لاتـــغرنـك منــي هدأتـــــي = لا يمــوت الثــأر و لــكن يســتعـدُ


لا يغرنـــك نصــلٌ موغـــلٌ = في عروقي …فـأنا منه أحـّـــدُ


إن ما ضُيع في ساح الوغى = في سوى ساحــاتـها لا يــستردُ


#11

السلام عليكم

مشكلة استعلامك في الـ INNER JOINS التي فيه

بهذا الشكل سيعمل استعلامك بشكل صحيح بإذن الله :

SELECT DISTINCT a.dist_name, a.count_all, b.count_active, c.count_not_active
FROM (

SELECT dist_name, count( * ) AS count_all
FROM dists
GROUP BY dist_name
) AS a
INNER JOIN (

SELECT dist_name, count( * ) AS count_active
FROM dists
WHERE active =1
GROUP BY dist_name
) AS b ON a.dist_name = b.dist_name
INNER JOIN (

SELECT dist_name, count( * ) AS count_not_active
FROM dists
WHERE active =0
GROUP BY dist_name
) AS c ON a.dist_name = c.dist_name
GROUP BY dist_name

أو بطريقة أخرى و بالاستفادة قدر الأمكان مما لدينا بتخفيف عدد الاستعلامات :

SELECT DISTINCT a.dist_name, a.count_all, b.count_active, (
a.count_all - b.count_active
) AS count_not_active
FROM (

SELECT dist_name, count( * ) AS count_all
FROM dists
GROUP BY dist_name
) AS a
INNER JOIN (

SELECT dist_name, count( * ) AS count_active
FROM dists
WHERE active =1
GROUP BY dist_name
) AS b ON a.dist_name = b.dist_name
GROUP BY dist_name

بتوفيق الله

تم تعديل هذه المشاركة بواسطة MoHaMMaD Pro في 20 أغسطس 2011 في 04:17

1

Everything will be fine when we TALK LESS, DO MORE


#12

جزاكم الله خيراً :)

#13

طيب إستفسار آخر بارك الله فيكم

عندما أقوم بالإستعلام عن الجدول ويكون( كافة الـ Rows قيمة الحقل (ACTIVE) فيها = صفر ) لايظهر لي أي نتيجة إلا عندما أقوم بتغيير قيمة الحقل Active في أي Row إلى 1

ماهو الحل بهذه المشكلة ,, اريد الإستعلام ان يظهر النتائج سواء كانت جميع قيم الحقل ACTIVE = 0 or ACTIVE = 1

ولكن الإستعلام بشكل عام يعمل بشكل ممتاز وشكراً لكم جميعاً

#14

مرحبا ,,

كيف يمكنني إستخدام أكثر من دالة داخل الحقل الواحد

قمت بوضع الـ insert التالية ولكنها لم تعمل بشكل صحيح

insert into dists (dist_name,dist_value,active) values (year(now())'ahmad'),100,0)

باختصار اريد ان اضع في حقل ال dist_name إسم المستخدم والسنة الحالية لكي تساوي = AHMED 2011

وهكذا

تم تعديل هذه المشاركة بواسطة dot.net2008 في 22 أغسطس 2011 في 20:28

#15

المشكلة ليست في استخدام أكثر من دالة، فقط عليك أن تضيف + قبل 'ahmad'

لاتـُهيئ كفني ما متّ بعد = لم يزل في أضلعي برقٌ و رعدُ


أنــا اسـلامــي ..أنا عزّته = أنا خيل الله نحو النصــر تعــدو


أنــا تــاريـخـي …ألا تعــرفـه = خـالد ينبض في روحــي و سعدُ


لاتـــغرنـك منــي هدأتـــــي = لا يمــوت الثــأر و لــكن يســتعـدُ


لا يغرنـــك نصــلٌ موغـــلٌ = في عروقي …فـأنا منه أحـّـــدُ


إن ما ضُيع في ساح الوغى = في سوى ساحــاتـها لا يــستردُ


#16

بارك الله فيك اخي الكريم جربت وضع + و & ولم ينجح الإستعلام

insert into dists (dist_name,dist_value,active) values (year(now())&'ahmad'),100,0)

insert into dists (dist_name,dist_value,active) values (year(now())+'ahmad'),100,0)

وبالنسبة لهذه المشاركة

/index.php?showtopic=246981&view=findpost&p=1224356

هل من حل

#17

شباب أرجوا المساعدة ,, للرفع

#18

أجو أن تحاول استخدام concat بعد تحويل التاريخ إلى نص كالتالي

insert into dists (dist_name,dist_value,active) values (concat(str_to_date(year(now())),'ahmad')),100,0)

بالنسبة للطلب الآخر، أنا أعتذر فما زلت أواجه بعض المشاكل على جهازي

1

لاتـُهيئ كفني ما متّ بعد = لم يزل في أضلعي برقٌ و رعدُ


أنــا اسـلامــي ..أنا عزّته = أنا خيل الله نحو النصــر تعــدو


أنــا تــاريـخـي …ألا تعــرفـه = خـالد ينبض في روحــي و سعدُ


لاتـــغرنـك منــي هدأتـــــي = لا يمــوت الثــأر و لــكن يســتعـدُ


لا يغرنـــك نصــلٌ موغـــلٌ = في عروقي …فـأنا منه أحـّـــدُ


إن ما ضُيع في ساح الوغى = في سوى ساحــاتـها لا يــستردُ


#19

الله يجزيك الخير فعلاً Concat كانت هي الحل

انتظر حل المشكلة الأخرى من الشباب :)

#20

طيب إستفسار آخر بارك الله فيكم

عندما أقوم بالإستعلام عن الجدول ويكون( كافة الـ Rows قيمة الحقل (ACTIVE) فيها = صفر ) لايظهر لي أي نتيجة إلا عندما أقوم بتغيير قيمة الحقل Active في أي Row إلى 1

ماهو الحل بهذه المشكلة ,, اريد الإستعلام ان يظهر النتائج سواء كانت جميع قيم الحقل ACTIVE = 0 or ACTIVE = 1

ولكن الإستعلام بشكل عام يعمل بشكل ممتاز وشكراً لكم جميعاً

#21

للرفع ,, ارجوا المساعدة ..

#22

السلام عليكم

آسف على التأخير....

SELECT DISTINCT a.dist_name, a.count_all, ifnull(b.count_active,0), c.count_not_active

FROM (

SELECT dist_name, count( * ) AS count_all

FROM dists

GROUP BY dist_name

) AS a

left JOIN (

SELECT dist_name, count( * ) AS count_active

FROM dists

WHERE active =1

GROUP BY dist_name

) AS b ON a.dist_name = b.dist_name

left JOIN (

SELECT dist_name, count( * ) AS count_not_active

FROM dists

WHERE active =0

GROUP BY dist_name

) AS c ON a.dist_name = c.dist_name

تم استبدال inner join بـ left join لكي يعيد الاستعلام كل السجلات حتى لو كان الطرف الآخر من الـ join لا يحوي أي سجلات

و تم استخدام التابع isnull لاستبدال قيم null بـ 0

للمزيد عن عبارات join تفضل الرابط التالي:

http://www.w3schools.com/Sql/sql_join.asp

تم تعديل هذه المشاركة بواسطة byte101 في 25 أغسطس 2011 في 18:44

1

لاتـُهيئ كفني ما متّ بعد = لم يزل في أضلعي برقٌ و رعدُ


أنــا اسـلامــي ..أنا عزّته = أنا خيل الله نحو النصــر تعــدو


أنــا تــاريـخـي …ألا تعــرفـه = خـالد ينبض في روحــي و سعدُ


لاتـــغرنـك منــي هدأتـــــي = لا يمــوت الثــأر و لــكن يســتعـدُ


لا يغرنـــك نصــلٌ موغـــلٌ = في عروقي …فـأنا منه أحـّـــدُ


إن ما ضُيع في ساح الوغى = في سوى ساحــاتـها لا يــستردُ


#23

أخي الكريم

انا عاجز عن شكرك والله ,, جزاك الله خيراً :)

وتقبل الله صيامكم وقيامكم

#24
dot.net2008 كتب:

أخي الكريم

انا عاجز عن شكرك والله ,, جزاك الله خيراً :)

وتقبل الله صيامكم وقيامكم

دعاء صغير بظهر الغيب يكون أكثر مما أستحق... :blush:

أخوك أبو عمر

لاتـُهيئ كفني ما متّ بعد = لم يزل في أضلعي برقٌ و رعدُ


أنــا اسـلامــي ..أنا عزّته = أنا خيل الله نحو النصــر تعــدو


أنــا تــاريـخـي …ألا تعــرفـه = خـالد ينبض في روحــي و سعدُ


لاتـــغرنـك منــي هدأتـــــي = لا يمــوت الثــأر و لــكن يســتعـدُ


لا يغرنـــك نصــلٌ موغـــلٌ = في عروقي …فـأنا منه أحـّـــدُ


إن ما ضُيع في ساح الوغى = في سوى ساحــاتـها لا يــستردُ


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

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

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

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

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