PDA

View Full Version : به نظر شما با يك query ميشه جواب گرفت؟!



powerware
جمعه 25 مرداد 1387, 11:04 صبح
سلام به همه دوستان

سوالي كه چند وقته در جستجوي جوابشم ولي هنوز راهي براش پيدا نكردم اينه كه فرض كنيد جدول زير رو داشته باشيد

f1------ f2----- f3
2 -------1-------1
4-------2 -------1 ------> يكي از خروجيها
23----- 1------ 2
34----- 2------ 2
54----- 3 ------2 ------> خروجي ديگر


خروجي اين query بايد به اين صورت باشه كه براي هر group از f1 تنها اون f3 ايي در نظر گرفته شود كه f2 آن مكزيمم باشد.

من مسئله رو با استفاده از يك جدول كمكي و دو query بصورت زير حلش كردم ولي ميخوام بدونم ايا با يك query هم قابل حله؟



SELECT f1, MAX(f2) AS MaxF2 INTO tempTable
FROM table1
GROUP BY f1

SELECT tt.f1, t.f3
FROM tempTable tt, table1 t
where tt.f1 = t.f1 AND tt.MaxF2=t.f2

Amir_Safideh
جمعه 25 مرداد 1387, 14:42 عصر
SELECT F1,(SELECT DISTINCT F2 FROM Table1 TInner WHERE TInner.F1 = TOuter.F1 AND F2 =
(SELECT DISTINCT MAX(F2) FROM Table1 TIn WHERE TIn.F1 = TOuter.F1))As F2,
(SELECT DISTINCT F3 FROM Table1 TInner WHERE TInner.F1 = TOuter.F1 AND F2 =
(SELECT DISTINCT MAX(F2) FROM Table1 TIn WHERE TIn.F1 = TOuter.F1))As F2
FROM Table1 TOuter
GROUP BY F1

چیزی که من متوجه شدم اینه که شما میخواهید که فیلد اف1 رو گروهبندی کنید به شرطی که فیلد اف2 در این گروهبندی در حالت ماکزیمم باشد .
-------------
موفق باشید .

KambizZandi
جمعه 25 مرداد 1387, 15:35 عصر
اول بايد f2 رو برحسب f1 پيدا کنيد بعدش اونو join کنيد:


select tbl2.f1, tbl2.f2, tbl2.f3
from tbl2
inner join(select f1, max(f2) as _max from tbl2 group by f1) tmax
on tmax.f1 = tbl2.f1 and tbl2.f2 = tmax._max

رضا جاسبی
شنبه 26 مرداد 1387, 00:18 صبح
Select F1,F3 from Table1 where exists
(Select F1,Max(f2) from Table1 tbl2
Having tbl2.f1 = table1.f1 and Max(f2) = table1.f2

powerware
دوشنبه 28 مرداد 1387, 10:08 صبح
با عرض سلام خدمت دوستان

از اينكه جواب منو داديد ممنونم. خودم خيلي سعي كردم راهي براش پيدا كنم ولي نتونستم اينجور كه پيداست بايد رو مبحث join بيشتر مطالعه كنم.

جوابها رو تست كردم .جواب اول و دوم هر دو درست بود ولي جواب سوم در عين اينكه ساده تر بود ولي انگار يه مشكلي داره. (اولين چيزي كه جلب نظر ميكنه اينه كه يه پرانتز كم داره) در عين حاليكه من نفهميدم tbl2 چيه؟

به هر حال از همه دوستان ممنونم.

mannai29
دوشنبه 28 مرداد 1387, 14:59 عصر
select f1,f3 from aaa t1
(where f2=(select max(f2) from aaa where f1=t1.f1

رضا جاسبی
دوشنبه 28 مرداد 1387, 23:46 عصر
من رو له کردی دوست عزیز ولی عیب نداره. درست میگی آخرش یک پرانتز جا افتاده.
اما tbl2 یک alias Name برای جدول اصلی یا همون Table1 است. درست مثل Touter در جواب اول و tmax در جواب دوم.

powerware
جمعه 15 شهریور 1387, 10:02 صبح
سلام آقا رضا

خدا نكنه له بشي. راستش من همون روز با پرانتز هم تستش كردم ولي اين خطاها رو ميده:


Server: Msg 8118, Level 16, State 1, Line 2
Column 'tbl2.f1' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Server: Msg 8119, Level 16, State 1, Line 2
Column 'tbl2.f1' is invalid in the HAVING clause because it is not contained in an aggregate function and there is no GROUP BY clause.


به هر حال ازت متشكرم.