ورود

View Full Version : درخواست یک کوئری برای Select کردن داده ها



BORHAN TEC
یک شنبه 16 مرداد 1390, 16:21 عصر
سلام

من برای نوشتن یک کوئری به مشکل برخورد کرده ام که شرح آن به شکل زیر است:
فرض کنید یک جدول به شکل زیر داریم که اطلاعات موجود در آن به شرح زیر است و نام جدول هم مثلاً myTable است:

Name | Family | Lesson | Mark
---------|--------------|--------------------|---------
Ali | Alian | Data Structure | 17
Ali | Alian | CPP | 13
Hamed | Najafi | CPP | 16
Hamed | Najafi | DB | 17
Hamed | Najafi | OS | 19

مسئله: می خواهیم ابتدا اطلاعات را گروه بندی کنیم و سپس سطری را به عنوان نتیجه ببینیم که بیشترین نمره شخص را در فیلد Mark مربوط به آن سطر وجود دارد. به عبارتی دیگر می خواهیم بعد از اجرای کوئری نتیجه زیر حاصل شود:

Name | Family | Lesson | Mark
---------|--------------|--------------------|---------
Ali | Alian | Data Structure | 17
Hamed | Najafi | OS | 19

من این موضوع را می دانم که این پایگاه داده از نظر نرمال سازی اشکال دارد. ولی چون این پایگاه داده بین چند برنامه مشترک است و از طرفی من کد مربوط به این برنامه را در اختیار ندارم نمی توانم ساختار پایگاه داده را تغییر دهم. حال کسی می تواند یک کوئری مناسب را برای رسیدن به نتیجه بنویسد؟ در صورت امکان کوئری به شکلی باشد که با استاندارد Ansi SQL 92 سازگار باشد تا بتوان از آن در RDMS های مختلف استفاده کرد.

Reza_Yarahmadi
یک شنبه 16 مرداد 1390, 17:08 عصر
در صورتی که فیلدی مثل ID که یونیک باشه نداشته باشید میتونید بصورت زیر عمل کنید (البته این روش در صورت وجود چند نمره بالا و برابر همه اونها رو لیست میکنه)
Create Table #Temp(
Name varchar(100),
Family varchar(100),
Lesson varchar(100),
Mark float)

Insert Into #Temp Values ('Ali','Alian','Data Structure',17)
Insert Into #Temp Values ('Ali','Alian','CPP',13)
Insert Into #Temp Values ('Hamed','Najafi','CPP',16)
Insert Into #Temp Values ('Hamed','Najafi','DB',17)
Insert Into #Temp Values ('Hamed','Najafi','OS',19)
Insert Into #Temp Values ('Hamed','Najafi','Data Structure',19)

Select T1.*
From
#Temp T1, (Select
Name, Family, Max(Mark) as Mark
From #Temp
Group By Name, Family
) T2
Where
T1.Name = T2.Name
AND
T1.Family = T2.Family
AND
T1.MArk = T2.Mark


Drop Table #Temp
و در صورت وجود فیلد یونیک میشه بصورت زیر عمل کرد
Create Table #Temp(
ID Int Identity(1,1),
Name varchar(100),
Family varchar(100),
Lesson varchar(100),
Mark float)

Insert Into #Temp Values ('Ali','Alian','Data Structure',17)
Insert Into #Temp Values ('Ali','Alian','CPP',13)
Insert Into #Temp Values ('Hamed','Najafi','CPP',16)
Insert Into #Temp Values ('Hamed','Najafi','DB',17)
Insert Into #Temp Values ('Hamed','Najafi','OS',19)
Insert Into #Temp Values ('Hamed','Najafi','Data Structure',19)

Select T1.*
From
#Temp T1, (Select
Name, Family, Max(ID) as ID
From #Temp
Group By Name, Family
) T2
Where
T1.ID = T2.ID


Drop Table #Temp

البته روشهای دیگه ای هم وجود داره ، ولی باید ساختار کامل جدول و تمام معیارهای انتخاب معلوم بشه.