PDA

View Full Version : بدست آوردن MAX در یک Select خاص



mohammad.es24
سه شنبه 18 بهمن 1390, 14:40 عصر
سلام به همه دوستان خوبم.
من میخوام آخرین قیمت یک کالا رو در یک مکان یا فروشگاه خاص بدست بیارم.مثلا قیمت کالای 1 در فروشگاه x امروز 1 تومن هست فردا 2 تومن همون کالا در فروشگاه y امروز قیمتش هست 5 تومن فردا 1 تومن
یعنی اینکه این کالا در فروشگاه های خاص و تاریخ های مختلف قیمتاش تغییر میکنه.من میخوام آخیرین قیمت تغییر کرده رو بدست بیارم.ولی خودم که میام max تاریخ رو میگیرم میاد فقط یک تاریخ رو میگیره در صورتی که شاید در فروشگاه x در تارخ 1 قیمت تغییر کرده باشه در فروشگاه y در تاریخ 2 تتغییر کرده باشه.اینجوری میاد فقط تاریخ 2 رو نشون میده و تاریخ 1 رو حذف میکه.اگه where بذارم بگم فلان کد در فلان جا درسته ولی من نمیخوام where بذارم.میخوام همه ی آخرین قیمت های کالا در فروشگاه های مختلف رو نشون بده.ممنون میشم کمکم کنید.من خودم اینطوری نوشتم که درست جواب نمیده
select * from View_1
where PurchaseConfirmDate = (select MAX(PurchaseConfirmDate) from View_1 )
group by Name,Code,PurchaseConfirmDate,PurchaseNum,PurChase Status,OrderNum,OrderConfirmdate,RecieveNum,Reciev eStatus,GoodName,Quantity,UnitPrice,Provider

tiphooo
سه شنبه 18 بهمن 1390, 21:19 عصر
من نمی دونم فیلدهای شما چی هستند ولی اگر کد فروشگاه را Code و تاریخ ثبت قیمت را ,PurchaseDate و کد کالا Goods و قیمت فروش UnitPrice باشد Query زیر جواب کار شما را می دهد
SELECT P.*,Q.UnitPrice FROM (
SELECT Code,Goods,MAX(PurchesDate) PurchesDate FROM View_1
GROUP BY Code,Goods)P
LEFT OUTER JOIN
(SELECT * FROM View1)Q
ON P.Code=Q.Code AND P.Goods=Q.Goods AND P.PurchesDate=Q.PurchesDate
بقیه فیلدها را می توانی از همان Q استخراج کنی
مانند Q.PurChaseStatus , Q.GoodName و .....

mohammad.es24
چهارشنبه 19 بهمن 1390, 17:36 عصر
فقط یه خواهش دیگه.امکانش هست یه توضیح مختصری هم راجع به کدها بدی.P و Q که گفتی چی هستسش وچرا این کارو انجام میدی.این کوئری که شما گفتین دقیقا همونی بود که من میخواستم.فقط اگه توضیح هم راجع بهش بدی خیلی ممنونت میشم

tiphooo
پنج شنبه 20 بهمن 1390, 03:04 صبح
دستور زیر را درنظر بگیرید
SELECT * FROM Table1
خروجی این دستور با
SELECT P.* FROM (SELECT * FROM Table1)P
هیچ فرقی ندارد
ولی این شکل استفاده مزایای زیادی از جمله در دیباگ کردن دستورات شما دارد
فرض کنید جدول شما دو فیلد با نام Field1 و Field2 از نوع Int دارد
و شما می خواهید حاصلجمع این دو فیلد را نیز در Query خود داشته و علاوه بر آن بر روی آن عملیات انجام دهید
اگر به صورت زیر بنویسید
SELECT P.* FROM (SELECT Field1,Feild2,Field1+Field2 AS Field3 FROM Table1)P
WHERE P.Field3 > 100
در اینجا انگار P یک جدول و Field3 یک فیلد از این جدول است (البته این ساده ترین مثالی بود که می شد زد و شاید دوستان برای این کار 100 راه حل ساده تر هم پیشنهاد دهند اما در مواردی مانند مورد شما این روش کمک زیادی به خوانا بودن و دقیق بودن و ساده بودن دستورات شما می دهد)
یک مثال دیگر
SELECT T1.F1,T2.F2 FROM T1
LEFT JOIN T2
ON T1.ID=T2.ID
حال اگر بخواهید با T3 هم با شرط دیگری Join بزنید خوانایی خود را از دست می دهد و هر چه تعداد Joinها بیشتر باشد بار دیگر که به کد مراجعه کنید خود شما هم متوجه نمی شوید چکار کرده اید
حال با اسامی مستعار و با روش پرانتزی دقت کنید

SELECT R.* ,S.F3 FROM (
SELECT P.ID,P.F1,Q.F2 FROM
(SELECT * FROM T1)P
LEFT JOIN
(SELECT * FROM T2) Q
ON P.ID=Q.ID)
)R LEFT JOIN
(SELECT * FROM T3)S
ON S.ID=R.ID

در این حالت هر کدام از اسامی مستعار را P,Q,R.S را می توانید جداگانه HighLight کرده و اجرا کنید و نتیجه را ببینید و اگر اشکالی داشتید برطرف کنید و متوجه می شوید اشکال در لایه اول یا دوم و یا .... کدام است
در لایه های بالاتر می توانید مجددا از همان اسامی استفاده کنید ولی بهتر است این کار را نکنید
بعضی از دوستان این کار را با WITH انجام می دهند که بنده به شخصه از این روش کارایی بهتری می گیرم.
به زبان بسیار ساده تر اگر بگویم فرض کنید n خط کد نوشته اید و خروجی ان هم معلوم است حال می خواهید نتیجه این n خط را n خط دیگر join زده و نتیجه دیگری بگیرید شاده ترین راه این است
مجموعه n دستور اول را داخل یک پرانتز باز و بسته بگذاریدو یک اسم به آن بدهید(P,Q و یا هر اسمی که می خواهید) و مجموعه n دستور دیگر را در یک پرانتز باز و بسته دیگر و یک اسم دیگر و زیر n دستور اول بگذارید(تعیین اسم بعد از پرانتز بسته است) Join مورد نطر را (Left,Right,Inner,..) را بین این دو n دستور بگذارید در ابتدای همه دستورات مجموعه فیلدهای مورد نیاز از هر n دستور و در انتهای کل دستورات شروط join را بگذارید
SELECT فیلدهای مجموعه اول , فیلدهای مجموعه دوم FROM (مجموعه اول ) نام مجموعه اول
نوع Join (مجموعه دوم) نام مجموعه دوم شروط join