PDA

View Full Version : Aggrigate در Group By و بیرون کشیدن سایر فیلدها



dkhatibi
چهارشنبه 12 دی 1386, 17:32 عصر
کوئری زیر را به کار برده ام.


select SQ.Class_name,max(moadel)as maxmoadel from
(select AVG(nomreh) as moadel,Nc.St_no,Cst.class_code,cn.Class_name from
Nomreh_class nc,Class_st Cst, Class_name cn where
nc.st_no=Cst.st_no and cn.class_code=Cst.class_code
Group By nc.St_no,cst.Class_code,cn.class_name)SQ group by SQ.class_Name

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

ماکسیمم شده را هم داشته باشم. برای این کار در اولین select الزاما باید Sq.St_no را هم

اضافه کنم که چون تو Group By اخری نیامده خطا می ده.
اگز اونو به Group By اخری اضافه کنم هم جواب مورد نظر به دست نمی آد. جواب همون

جوابی است که فقط از SubQuery به دست می آد.(دلیلش هم معلومه) برای رفع این مشکل

با استفاده از کوئری ها به این شکل راهی هست؟

A.Farzin
چهارشنبه 12 دی 1386, 19:09 عصر
SELECT TOP 1 SQ.* FROM (
SELECT AVG(Nomreh) AS Moadel, Nc.St_no, Cst.class_Code, Cn.Class_Name
FORM Nomreh_class nc INNER JOIN Class_st Cst
ON Nc.St_No = Cst.St_No INNER JOIN Class_name Cn
ON Cn.class_code = Cst.class_code
GROUP BY Nc.St_no, Cst.class_Code, Cn.Class_Name
ORDER BY AVG(Nomreh) DESC
) SQ

dkhatibi
چهارشنبه 12 دی 1386, 21:09 عصر
SELECT TOP 1 SQ.* FROM (
SELECT AVG(Nomreh) AS Moadel, Nc.St_no, Cst.class_Code, Cn.Class_Name
FROM Nomreh_class nc INNER JOIN Class_st Cst
ON Nc.St_No = Cst.St_No INNER JOIN Class_name Cn
ON Cn.class_code = Cst.class_code
GROUP BY Nc.St_no, Cst.class_Code, Cn.Class_Name
ORDER BY AVG(Nomreh) DESC
) SQ

خطای استفاده از Order By درون SubQuery می ده.
همچنین می خواهیم ماکسیمم معدل هر کلاس برگردونه .

A.Farzin
پنج شنبه 13 دی 1386, 23:02 عصر
از این استفاده کنید


SELECT TOP 1 SQ.* FROM (
SELECT AVG(Nomreh) AS Moadel, Nc.St_no, Cst.class_Code, Cn.Class_Name
FROM Nomreh_class nc INNER JOIN Class_st Cst
ON Nc.St_No = Cst.St_No INNER JOIN Class_name Cn
ON Cn.class_code = Cst.class_code
GROUP BY Nc.St_no, Cst.class_Code, Cn.Class_Name
) SQ
ORDER BY SQ.Moadel DESC

dkhatibi
شنبه 15 دی 1386, 09:36 صبح
توجه داشته باشد ماکسیمم هر کلاس مورد نظزه نه ماکسیمم کل

A.Farzin
شنبه 15 دی 1386, 18:35 عصر
اینو تست کنید


SELECT TOP 1 SQ2.* FROM (
SELECT AVG(SQ.Moadel) AS CMoadel, SQ.class_Code, SQ.Class_Name
FROM (
SELECT AVG(Nomreh) AS Moadel, Nc.St_no, Cst.class_Code, Cn.Class_Name
FROM Nomreh_class nc INNER JOIN Class_st Cst
ON Nc.St_No = Cst.St_No INNER JOIN Class_name Cn
ON Cn.class_code = Cst.class_code
GROUP BY Nc.St_no, Cst.class_Code, Cn.Class_Name
) SQ
GROUP BY SQ.class_Code, SQ.Class_Name
) SQ2
ORDER BY SQ2.CMoadel DESC
در ضمن کد دانشجو را در کنار معدل نشان نمی‌دهد. ساختار جداول شما را تا حدودی از روی کوئریتان حدس زدم ولی نتوانستم آنها را درک کنم.
1 - نام دانشجو در کدام جدول ذخیره می‌شود؟
2 - آیا در جدول Nomreh_Class فیلد کد کلاس هم دارید یا نه؟
3 - و ...
لطف کنید Script جداول را بگذارید تا بهتر بشود راهنمائی کرد.