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

استخدام SELECT DISTINCT مع ORDER BY

مغلق
بدأه in2sol في 20 يونيو 2006 · 8 رد · 744 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم اجمعين

كيف يمكنني استخدام ال Order by مع ال SELECT DISTINCT حيث انني عند استخدامهما معا احصل على رسالة الخطاء التالية:

"ORDER BY items must appear in the select list if SELECT DISTINCT is specified."

المشكلة انني لم اجد طريقة اخرى تمكنني من الوصول الى مبتغاي بدون استخدامهما والسبب هو :

ان لدي جدول كبير جدا لن اقوم بوضعه هنا ولكن ساضع جدول مشابه تماما له

لنفرض ان لدي 3 فروع لشركة ما واقوم بوضع اي عملية بيع تتم عن طريق هذه الفروع في جدول واحد

بالشكل التالي :

ID	branchName	branchId  transactionTime	  transactionValue
-------------------------------------------------------------------------
1	branch1	   	 1			1:30					200
2	branch2			2			1:31					150
3	branch3			3			1:31					300
4	branch2			2			1:40					150
5	branch2			2			1:43					200
6	branch1			1			1:43					300
7	branch3			3			1:44					250

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

ID	branchName	branchId   transactionTime		transactionValue
----------------------------------------------------------------------------------
6	branch1			1			1:43				300
5	branch2			2			1:43				200
7	branch3			3			1:44				250

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

تم تعديل هذه المشاركة بواسطة in2sol في 20 يونيو 2006 في 22:24

Success is the ability to go from one failure to the next without any loss of Enthusiasm

#2

ياشباب اذا كان السؤال غير مفهوم ارجو ان تنبهوني على الاقل ردوا وقولو اننا لم نجد له حلا حتى على الاقل افقد الامل واحاول من طريق اخر :(

Success is the ability to go from one failure to the next without any loss of Enthusiasm

#3

أنت ما كتبت محاولاتك

بس بتوقع هذا الإستعلام يشتغل معك

Select
	Top 3 Distinct BrandName
From X Order By TransactionTime DESC

جربه و رد لي خبر

سلام

#4

بسم الله الرحمن الرحيم

بعد إذنك أخى romantic

Select  Top 3 BrandName
From X Order By TransactionTime DESC

هذا يكفى

لا يمكن إستخدم top مع distinct ستعطى error

-waf

يا حى يا قيوم برحمتك أستغيث اصلح لى شأنى كله ولا تكلنى إلى نفسى طرفة عين

اللهم أعنا على ذكرك وشكرك وحسن عبادتك

اللهم انك عفو كريم حليم تحب العفو فاعفو عنا

اللهم إنى أسألك رضاك والجنة وأعوذ بك من سخطك والنار

اللهم إرحمنا فوق الأرض وإرحمنا تحت الأرض وإرحمنا وإعتق رقابنا يوم العرض

اللهم لا تدع لنا ذنبًا إلا غفرته ولا همًا إلا فرجته ولا مريضًا ولا دينًا إلا قضيته ولا عيبا إلا سترته ولا حاجًا هى لك رضا إلا قضيتها

اللهم انى أسألك موجبات رحمتك وعزائم مغفرتك والسلامة من كل إثم والغنيمة من كل بر والفوز بالجنة و النجاة من النار اللهم أمين يا رب العالمين

#5

بسم الله الرحمن الرحيم

اسفة بعد إذنك أخى design

ممكن اخى تجرب هذا الكود لان ال top تعطى الأعلى عاما مهما كان orderby

أما ال max مع group by فبإذن الله تكون هى الحل المناسب لحالتك

كود

Select  Max(BrandName)
From X 
 Group By BrandName
Order By TransactionTime DESC

-waf

يا حى يا قيوم برحمتك أستغيث اصلح لى شأنى كله ولا تكلنى إلى نفسى طرفة عين

اللهم أعنا على ذكرك وشكرك وحسن عبادتك

اللهم انك عفو كريم حليم تحب العفو فاعفو عنا

اللهم إنى أسألك رضاك والجنة وأعوذ بك من سخطك والنار

اللهم إرحمنا فوق الأرض وإرحمنا تحت الأرض وإرحمنا وإعتق رقابنا يوم العرض

اللهم لا تدع لنا ذنبًا إلا غفرته ولا همًا إلا فرجته ولا مريضًا ولا دينًا إلا قضيته ولا عيبا إلا سترته ولا حاجًا هى لك رضا إلا قضيتها

اللهم انى أسألك موجبات رحمتك وعزائم مغفرتك والسلامة من كل إثم والغنيمة من كل بر والفوز بالجنة و النجاة من النار اللهم أمين يا رب العالمين

#6

احبتي شكرا لكم على ردودكم واسف جدا لعدم الرد الا متاخرا

عموما اخي Desigen و اخي enjyshahin

ان استخدام ال Order by مع ال SELECT DISTINCT يعطي رسالة خطاء

وانا اسف جدا انني لم اضع محاولاتي :")

على اي حال اخر محاولاتي كانت كما قال الاخ enjyshahin هو استخدام ال distinct مع ال group by وال max

ولان الجدول لن يكون كما في المثال السابق بين ثلاثة فروع فقط وانما بين ما يزيد على السبعين

قمت بعمل استعلامين الاول واسميته TopGainer هو كان لترتيب الفروع على حسب اخر عملية لها بالشكل التالي

select DISTINCT branchId  , MAX(transactionTime)as LastTime
from X 
GROUP BY branchId

والثاني كان لاستخلاص اعلى الاسعار

من وكان على الشكل التالي :

select branchName, transactionValue
from X, TopGainer
where x.branchId = TopGainer.branchId and x.transactionTime = TopGainer.LastTime
order by transactionTime

حيث x هو اسم الجدول الاصلي

وعلى اي حال فان استخدام ال Top مع الdistinct لا يعطي رسالة خطا معي ولكن الذي يعطي خطا هنا هو استخدام ال order by خصوصا اذا عملت ترتيبا لا يعتمد على ما تم استدعاؤه ..... والله اعلم

اشكركم مجددا

تم تعديل هذه المشاركة بواسطة in2sol في 24 يونيو 2006 في 13:26

Success is the ability to go from one failure to the next without any loss of Enthusiasm

#7

جرب هذا الرد يا اخي

select   *  from  X As X1
Where   X1.transactionTime = (Select Max(X2.transactionTime ) From X As X2 Where X1.branchId = X2.branchId )

حيث ان الحل الذي ذكرته الاخت انجي جيد و لكن لا تستطيع عرض كل الاعمدة الخاصة بالجدول لانها اذا فعلت ذلك ستدخل هذه الاعمدة في الGroup و بالتالي سيتغير الحل و التجربة هي التي ستحدد

جرب الحل و ابلغنا في النتيجة

تم تعديل هذه المشاركة بواسطة AbuZakaria في 24 يونيو 2006 في 20:35

#8

شكرا لك اخي زكريا

الحمد لله تم حل المشكله وكان ذلك بسببكم بعد توفيق الله

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

مع ان الكود الذي اعطيتنياه مثير جدا للاهتمام لدرجة انني افكر ان اعيد كتابت ال SPs فقط لتجربته

اشكر لكم اهتماممكم يا اخواتي واخواتي واتمنا ان يقدر الله لي ان اضيف شيا جديدا للمنتدى بحكم ان هذه المشاركه هي الاولى لي فيه

وفقنا واياكم الله تعالى لرفعة هذه الامه

Success is the ability to go from one failure to the next without any loss of Enthusiasm

#9

بسم الله الرحمن الرحيم

الحمد لله اخى in2sol أن وفقك الله إلى الحل الصحيح وشكرا للأخ AbuZakaria

وكلنا أخوه في الله

يا حى يا قيوم برحمتك أستغيث اصلح لى شأنى كله ولا تكلنى إلى نفسى طرفة عين

اللهم أعنا على ذكرك وشكرك وحسن عبادتك

اللهم انك عفو كريم حليم تحب العفو فاعفو عنا

اللهم إنى أسألك رضاك والجنة وأعوذ بك من سخطك والنار

اللهم إرحمنا فوق الأرض وإرحمنا تحت الأرض وإرحمنا وإعتق رقابنا يوم العرض

اللهم لا تدع لنا ذنبًا إلا غفرته ولا همًا إلا فرجته ولا مريضًا ولا دينًا إلا قضيته ولا عيبا إلا سترته ولا حاجًا هى لك رضا إلا قضيتها

اللهم انى أسألك موجبات رحمتك وعزائم مغفرتك والسلامة من كل إثم والغنيمة من كل بر والفوز بالجنة و النجاة من النار اللهم أمين يا رب العالمين

هذا الموضوع مغلق.

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