ParsX.com
پذیرش پروژه از دانشجویی ... تا سازمانی 09376225339
 
   ProfileProfile   Log in to check your private messagesLog in to check your private messages  |  FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups Log inLog in   RegisterRegister 

group Functions توابع گروهي و GROUP BY

 
Post new topic   Reply to topic    ParsX.com Forum Index -> اس . كيو . ال SQL
View previous topic :: View next topic  
Author Message
vahid
بي تو هرگز


Joined: 26 Nov 2004
Posts: 3067
Location: Tehran

PostPosted: Wed Dec 01, 2004 7:25 pm    Post subject: group Functions توابع گروهي و GROUP BY Reply with quote

Sum - Avg - Min - Max - Count - SetDev - Var - First - Last - Expression - Where

Select Min(grade) from grade

براي وارد كردن دستور فوق مراحل زير را در بانك اطلاعاتي Access طي كنيد . ابتدا بانك اطلاعاتي جديد باز كنيد و در ان جدولي به نام grade كه فيلد هاي ان حاوي نمرات ميباشد را وارد كنيد سپس از انجا دكمه Queries را انتخاب كنيد . دكمه create Query in Design view را انتخاب كنيد سپس از انجا به View/SQL View برويد و دستور فوق را وارد كنيد براي اجرا شدن ان از دكمه علامت تعجبي كه در بالاي صفحه ميبينيد استفاده كنيد .
استفاده از تابع Min باعث ميشود كه كمترين نمره از جدول grade در خروجي تقاضا (Qurey) نمايش داده شود . فرضا اگر نمرات به ترتيب 20,18,14,3,6,7.5,20,19 بود پايين ترين نمره كه در اين ليست 3 است اورده ميشود . اما چيزي كه در خروجي به نظر ميرسد چندان جالب توجه نيست بنابراين براي انكه نام فيلد خروجي ما چيزي باشد كه كاربري كه ميخواهد نتيجه گزارش را ببيند مناسب باشد دستور فوق را به ترتيب زير عوض ميكنيم :
Select Min(grade) as Minimum from grade

بنابراين خروجي مينيموم نمره با مشخصه Minimum در نام فيلد را ميبينيد . با استفاده از AS ميتوان نام جديدي براي ستون خروجي درست كرد بنابراين كلمه اي كه بعد از as مي ايد كاملا سليقه ايست و پيرو قانون خاصي نيست ! به عبارت بعد از AS اصطلاحا alias ميگويند .
مثال ديگري ميزنيم : اين مثال در خروجي ميانگين نمرات جدول student را كه كدگروه انها 8 ميباشد را در خروجي نمايش ميدهد .
Select Avg(Grade) from student where groupcode=”11”
همانطور كه ميبينيد براي انكه كدگروه 11 را در خروجي ببينيم از دستور Where استفاده كرديم دستور فوق ميانگين نمراتي كه كدگروه ان نمرات 11 ميباشد را نشان ميدهد .
اگر توجه كنيد متوجه ميشويد كه كد گروه در دو دابل كتويشن قرار گرفته است اين به ان دليل است كه نوع groupcode از نوع Text ميباشد ميتوانيد ان نوع را به number تغيير دهيد تا ديگر به اين جفت كوتيشن احتياجي نداشته باشيد .
Select Sum(grade*unit) from grade

مجموع نمرات ضربدر تعداد واحد درسي را از جدول نمرات grade محاسبه ميكند و در خروجي نشان ميدهد . ميتوانيد از as newname در جلوي تابع sum استفاده كنيد .
Select Stno,avg(grade) from grade group by stno

و اما دستور فوق كه ميبينيد دستوريست كاملا شبيه به دستورات بالا منتهي از دستوري ديگري به نام group by نيز استفاده كرده ايم . استفاده از اين دستور كاملا اجباريست ! چرا كه از دستورات توابع گروهي استفاده كرده ايد . همانطور كه ميبينيد از تابع avg براي اين دستور استفاده كرده ايد ; منتهي قبل از ان از يكي از فيلد ها نيز براي نمايش داده شدن استفاده كرده ايد . اين فيلد چون از نوع توابع گروهي نيست بنابراين بايد با استفاده از دستور group by گروه بندي را بر اساس ان انجام داد .
بهتر است كمي درباره دستور فوق بحث و بررسي انجام دهيم . همانطور كه در دستور فوق ميبينيد از تابع avg براي ميانگين گرفتن استفاده كرده ايم اما قبل از ان stno را نيز اورده ايم . با كمي تفكر بر روي اينكه چرا stno امده است ميتوانيد به اين نتيجه برسيد كه stno دليل نداشته است كه در اين تقاضا بيايد جز انكه بر اساس ان تابع گروهي ما عمل كند . بنابراين چون تابع گروهي ما كه در اينجا avg است به همراه stno امده است بنابراين بايد دستور ميانگين را بر اساس Stno يا همان شماره دانشجويي انجام دهد . بنابراين با استفاده از دستور group by ميانگين نمرات را بر اساس Stno گروه بندي ميكنيد . لذا اگر علاوه بر stno از فيلد ديگري نيز استفاده كنيد . يعني تابع avg خود را ميخواهيد باز هم كوچك تر كنيد . و بر اساس ان بايد گروه بندي خود را جامع تر كنيد . يعني اگر فرض كنيم علاوه بر Stno از term نيز استفاده ميكنيم . لذا گروه بندي بر اساس شماره دانشجويي و ترم انتخابي انجام ميشود . اين به ان معنيست كه ديگر استفاده از تابع ميانگين براي كليه نمرات يك دانش نيست بلكه براي انستكه ميانگين نمرات هر دانشجو در هر ترم اندازه گيري شود و در خروجي نمايش داده شود بنابراين براي انكه از تابع ميانگين براي جدا كردن درس ها از ترم هاي تحصيلي استفاده كنيم دستور فوق به شكل زير تغيير پيدا ميكند
select stno,term,avg(grade) from grade group by stno, term
از توضيحات فوق ميتوان اين نتيجه را نيز به دست اورد كه هر گاه از تابعهاي گروهي در دستوري استفاده كرديم براي انكه از group by استفاده نكنيم نبايد بر اساس فيلدي انرا محدود كنيم چراكه استفاده از همان فيلد مذكور منجر به استفاده از group by ميشود .
با تشكر از استاد رئوف مكفي
Back to top
vahid
بي تو هرگز


Joined: 26 Nov 2004
Posts: 3067
Location: Tehran

PostPosted: Wed Dec 01, 2004 9:53 pm    Post subject: Reply with quote

در هر صورت هر گاه از توابع جمعي استفاده كرديم براي گسترش قابليت بيشتر آنها بايد از Group by استفاده كنيم . Group by براي مشخص كردن گروههايي استفاده ميشود كه سطرهاي خروجي بايد در انها قرار بگيرند و وقتي از توابع جمعي استفاده ميكنيد خلاصه داده ها برا ان گروه محاسبه ميشود . . گروه بندي عموما مستقل از ستونهاي دستور SELECT انجام ميشود . هر يك از ستونهايي كه فاقد توابع جمعي بوده و در دستور SELECT مشخص شده اند بايد در عبارت group by فهرست شوند . دليل اين امر قانوني است كه بر طبق ان هر فيلدي كه در فهرست انتخاب قرار ميگيرد بايد تنها يك مقدار عبارت براي Group by برگرداند .
Back to top
emsii
دوست آشناي سايت


Joined: 16 Dec 2005
Posts: 90
Location: tehran

PostPosted: Thu Mar 30, 2006 10:46 pm    Post subject: Reply with quote

Tafavoote Karee Where Ba Having dar Chist
PLZ nagoo Having ba group miyad
tafavoote Kariiiiiiiiiiiiiiiiiiiiiiiiiiiii Begooo doste aziz
Back to top
vahid
بي تو هرگز


Joined: 26 Nov 2004
Posts: 3067
Location: Tehran

PostPosted: Sat Apr 01, 2006 7:52 am    Post subject: Reply with quote

وقتي ميگيم where يعني تك تك ركوردها . اما وقتي از having استفاده ميكنيم منظورمون دسته ركوردهايي هست كه با group by دسته بندي شدن .
مثلا :
S e l e c t  name,count(*) f r o m tbl w h e r e shsh>=234
G r o u p by  everything
H a v i n g condition

بدنبال ركوردهايي كه shsh انها بزرگتر از 234 هست ميگرده و پيدا ميكنه بعد كه پيدا كرد اونها رو بر اساس everything دسته بندي ميكنه حالا كه دسته بندي شدن توي اون دسته ها بدنبال دسته هايي ميگرده كه شرط condition رو دارند . به هر حال where بعد از group by نيمتونه بياد اگه فرضا ميتونست بياد وظيفه اش دقيقا مشابه having بود .
اميدوارم فهميده باشي ...
Back to top
Display posts from previous:   
Post new topic   Reply to topic    ParsX.com Forum Index -> اس . كيو . ال SQL All times are GMT + 3.5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum