View Full Version : کمک در نوشتن کوئــــــــــری
پوریا_م
پنج شنبه 23 تیر 1390, 19:26 عصر
جدولی شامل سه فیلد کدپرسنلی : PCode سال : Year و ماه : Month داریم
در این جدول برای پرسنلی با کد مثلا 10 اطلاعات 12 ماه سال 89 و 3 ماه اول سال 90 ثبت شده است
من قصد دارم کدی بنویسم که برای این پرسنل آخرین اطلاعات سال و ماه را بدهد در واقع کدی که خروجی آن برای این
پرسنل تنها یک رکورد شامل سال 90 و ماه 3 باشد .
چگونه این کد را بنویسم؟
دوستان در این جدول اطلاعات سالها و ماههای مختلف پرسنل ذکر شده که من برای نمومه این پرسنل را مثال زدم در واقع میخواهم برای این پرسنل خاص
رکوردی که دور آن خط کشیده شده را نمایش دهد.
در ضمن این کد نیز جواب نمیدهد
72455
Select PCode,Max(Year) Year,Max(Month) Month From Table1
Group By PCode
maryam_20
پنج شنبه 23 تیر 1390, 20:30 عصر
خوب اگه براي يه پرسنل خاص مي خواي جواب بده تو كوئريت همچين چيزي نيست بايد كد پرسنلي رو با يه پارامتر بدي به store procedure اينطوري:
CREATE PROCEDURE update_table1(@a int)
as
begin
Select PCode,Max(Year) as Year,Max(Month) as Month
From Table1
where pcode=@a
end
MSN_Issue
پنج شنبه 23 تیر 1390, 21:27 عصر
select * from your_tbl where PCode=10 order by year desc, month desc limit 1
پوریا_م
پنج شنبه 23 تیر 1390, 22:00 عصر
خوب اگه براي يه پرسنل خاص مي خواي جواب بده تو كوئريت همچين چيزي نيست بايد كد پرسنلي رو با يه پارامتر بدي به store procedure اينطوري:
CREATE PROCEDURE update_table1(@a int)
as
begin
Select PCode,Max(Year) as Year,Max(Month) as Month
From Table1
where pcode=@a
end
مریم خانم میشه بگید این کد با کدی که خودم گفتم چه فرقی میکنه؟با دادن کد پرسنل 10 به کد شما سال 90 و ماه 12 را میدهد که اشتباه است.لزوما نیازی به پروسیجر نیست
پوریا_م
پنج شنبه 23 تیر 1390, 22:26 عصر
دوستان مسئله رو یکبار دیگه باز میکنم .جدول من در واقع شامل اطلاعات فیش حقوقی پرسنل میباشد که دو فیلد آن
سال و ماه میباشد. در واقع در هرماه که از سال پرسنل حقوق بگیرد اطلاعات آن در این جدول ثبت میشود.حال اگر
من بخواهم بدانم آخرین حقوقی که هر پرسنل گرفته است مربوط به چه سال و ماهی است قاعدتا باید برای هر کد
پرسنل Max (Year) را انتخاب کنم اما برای پیدا کردن ماه چگونه باید عمل کنم .بعنوان مثال نتیجه کوئری باید
ردیف هایی از جدول را نشان دهد که در شکل زیر با علامت قرمز مشخص شده است.
72461
http://barnamenevis.org/images/misc/pencil.png
پوریا_م
پنج شنبه 23 تیر 1390, 22:30 عصر
select * from your_tbl where PCode=10 order by year desc, month desc limit 1
دوست عزیز ممنون اما کد شما برای یک پرسنل تنها جواب میدهد البته با اصلاح زیر . من این اطلاعات را برای چندین پرسنل میخواهم
Select Top 1 PCode,Yeeaar,Moonth From P_Fish
Where PCode = 10
order By Yeeaar Desc ,Moonth Desc
maryam_20
پنج شنبه 23 تیر 1390, 22:45 عصر
ببخشيد من درست متوجه منظورتان نشده بودم
من اگه جاي شما بودم در برنامه ام از يه حلقه for استفاده مي كردم و دونه دونه كدهاي پرسنلي رو بهش مي دادم و آخرين حقوقشون رو مي گرفتم و تو همون حلقه يكي يكي سطر هام رو به dataset اضافه مي كردم.
ولي داخل كوئري راهي به ذهنم نمي رسه
دوستان حتما راه بهتري سراغ دارند
yektax
جمعه 24 تیر 1390, 02:56 صبح
with Temp (PCode , [Year], [Month] , RowNum)
AS
(SELECT PCode , [Year], [Month],
ROW_NUMBER() OVER (PARTITION BY PCode ORDER BY [Year] Desc , [Month] Desc ) as RowNum
FROM dbo.YourTable
)
SELECT PCode , [Year], [Month]
FROM Temp
WHERE Temp.RowNum = 1
یوسف زالی
جمعه 24 تیر 1390, 03:26 صبح
سلام.
یک راه بسیار ساده داره:
select PCode,max(Year* 12 +Month)/12 as Year,max(Year* 12 +Month)%12 as Month
from table_name
group by PCode
محمد سلیم آبادی
جمعه 24 تیر 1390, 05:57 صبح
این مساله معروف به TOP n for each group هست. با این اشاره که هر دو راه حل پست شماره 9 و 8 صحیح هستند.
http://www.30sharp.com/article/13/210/11/%d8%a2%d8%ae%d8%b1%db%8c%d9%86-%d8%b3%d9%81%d8%a7%d8%b1%d8%b4-%d9%87%d8%b1-%d9%85%d8%b4%d8%aa%d8%b1%db%8c-top-n-for-each-group.aspx
پوریا_م
جمعه 24 تیر 1390, 16:22 عصر
سلام.
یک راه بسیار ساده داره:
select PCode,max(Year* 12 +Month)/12 as Year,max(Year* 12 +Month)%12 as Month
from table_name
group by PCode
دوست عزیز کدی که شما نوشته اید تقریبا درست است اما یک استثناء را در خود رعایت نمیکند و آن این است که اگر آخرین اطلاعات پرسنلی در ماه 12 سالی ثبت شده باشد این کد برای آن پرسنل سال بعدش و ماه 0 را بعنوان خروجی میدهد،اگر میشود این خطا را در کدتان اصلاح نمایید.با تشکر
پوریا_م
جمعه 24 تیر 1390, 16:24 عصر
سلام.
یک راه بسیار ساده داره:
select PCode,max(Year* 12 +Month)/12 as Year,max(Year* 12 +Month)%12 as Month
from table_name
group by PCode
دوست عزیز کدی که شما نوشته اید تقریبا درست است اما یک استثناء را در خود رعایت نمیکند و آن این است که اگر آخرین اطلاعات پرسنلی در ماه 12 سالی ثبت شده باشد این کد برای آن پرسنل سال بعدش و ماه 0 را بعنوان خروجی میدهد،اگر میشود این خطا را در کدتان اصلاح نمایید.با تشکر
یوسف زالی
جمعه 24 تیر 1390, 20:21 عصر
select PCode,max(Year* 12 +Month)/12 as Year,max(Year* 12 +(Month -1))%12 +1 as Month
from table_name
group by PCode
پوریا_م
شنبه 25 تیر 1390, 08:27 صبح
select PCode,max(Year* 12 +Month)/12 as Year,max(Year* 12 +(Month -1))%12 +1 as Month
from table_name
group by PCode
دوست عزیز از راهنمایی شما ممنونم .
یوسف زالی
شنبه 25 تیر 1390, 09:00 صبح
خواهش می کنم.
بهتره که از دکمه تشکر استفاده بشه.
موفق باشید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.