View Full Version : فیلتر کردن این کوری رو چه طوری انجام بدم ؟
NasimBamdad
جمعه 22 شهریور 1392, 10:57 صبح
سلام و خسته نباشید .
یک کوری دارم به شکل زیر هست
Select fname,lname,serial,date From patients
همون طور که مشخص هست ، نام و نام خانوادگی ، شماره سریال دفترچه بیمه و تاریخ پذیرش نسخه رو می تونیم ببینیم .
من می خوام یک فیلتر از کوری ام بکنم ، طوری که بگم اگر در یک روز ( Date ) ، بیشتر از 1 نسخه وجود داشت ( serial ) ، فقط اولین رو نمایش بده .
یعنی می خوام از نسخی که در یک روز پذیرش می شوند جلوگیری کنم ، طوری که فقط یک نسخه در روز داشته باشم .
یعنی هر شماره سریال باید فقط یکیش در یک روز باشه !
امیدوارم متوجه شده باشید .
به نظر شما چه باید کرد ؟!
NasimBamdad
جمعه 22 شهریور 1392, 11:06 صبح
به نظر شما کوری زیر صحیح هست ؟ ؟
Select Distinct serial,nos_date from patients
order by nos_date
صباح فتحی
جمعه 22 شهریور 1392, 11:34 صبح
سلام راستش متوجه نشدم ولی خب کلمه Distinct رو بنویسی از واکشی رکوردهای اضافه جلوگیری میکنه
NasimBamdad
جمعه 22 شهریور 1392, 14:34 عصر
عکسی که پیوست کردم رو ببین ، در یک 1روز ( در اون تاریخ ) 2 تا نسخه پذیرش شده .
یعنی 2 تا رکورد داریم ، چه طوری کاری کنیم که در یک روز برای اون شماره سریال بیشتر از 1 نسخه نمایش داده نشه !
NasimBamdad
جمعه 22 شهریور 1392, 21:36 عصر
کسی نبود ؟ کسی بلد نیست !؟
dabirsiaghi
جمعه 22 شهریور 1392, 21:48 عصر
distinct یا Group By استفاده کن
NasimBamdad
جمعه 22 شهریور 1392, 22:00 عصر
distinct یا Group By استفاده کن
میشه با توجه به جداول من یک مثال بزنی ؟
من هرچی می زنم یه ارروری میده !
lastmory
شنبه 23 شهریور 1392, 10:50 صبح
با سلام
چه اروری داری ؟
این سلکتت درسته
Select Distinct serial,nos_date from patients
order by nos_date
اینم میتونی استفاده کنی
Select serial,nos_date from patients
group by serial,nos_date
NasimBamdad
شنبه 23 شهریور 1392, 14:15 عصر
با سلام
چه اروری داری ؟
این سلکتت درسته
Select Distinct serial,nos_date from patients
order by nos_date
اینم میتونی استفاده کنی
Select serial,nos_date from patients
group by serial,nos_date
در این حالت ارروری نمی ده، اما من در Select می خوام فیلد ها و ستون های دیگه هم در کوری نمایش داده بشه در عین حال هم تکراری نبودن فیلد ها بر اساس 2 فیلد serial,date هم رعایت بشه !
متوجه منظورم هستید ؟
lastmory
شنبه 23 شهریور 1392, 14:37 عصر
متوجه منظورم هستید ؟
بله هستم ، اگه از group by بخوای استفاده کنی باید تمامی ه فیلدهایی رو که تو سلکتت مینویسی ، جلوی group by هم بنویسی ، که اگر توی سلکتت از Sum , Count یا Aggregate Function های دیگه ای داری استفاده میکنی این group by توصیه میشه اما اگر نه ، از همون Distinct استفاده کن
اونوقت هم شما میگی که میخوای فیلدهای دیگه رو هم بیاری اما تکراری نبودن فیلدها رو براساس serial,date کنترل کنی ، که این شدنی نیستش و منطقی هم نیست اگر میخوای تکراری نبودن رو کنترل کنی توی سلکتت باید روی تمام فیلدهایی که داری فراخوانی میکنی شرط تکراری نبودن اعمال بشه
موفق باشی
محمد سلیم آبادی
شنبه 23 شهریور 1392, 15:33 عصر
قبلا نیز از این گونه مسائل در این تالار مطرح شده و به جواب نیز رسیده بودند.
توسط تابع row_number بسادگی اینگونه مسائل را میتوان حل کرد. کافیه بر اساس مجموعه ستون هایی که ممکن تکراری باشن گروه بندی (بخش بندی) کنید و به هر کدام یک شماره دهید و در آخر...
select *
from
(
select *, row_number() over(partition by serial, non_date order by non_date) as rnk
from patients
)d
where rnk = 1
NasimBamdad
شنبه 23 شهریور 1392, 22:13 عصر
ممنونم کمک زیادی کردید ، یه سوال دیگه . بی زحمت این کوری رو ببینید ، با متد شما نوشته شده
select *
from
(
SELECT dbo.patients.serial, dbo.patients.nos_date, dbo.patients.expr_date, dbo.patients.fname, dbo.patients.lname
, row_number() over(partition by dbo.patients.serial, dbo.patients.nos_date_miladi order by dbo.patients.nos_date_miladi) as rnk
FROM dbo.patients INNER JOIN
dbo.pezeshk ON dbo.patients.pezeshk = dbo.pezeshk.id INNER JOIN
dbo.experty ON dbo.pezeshk.experty_code = dbo.experty.id
WHERE dbo.patients.bime = '2' AND dbo.patients.khadamat_type = '1' AND dbo.patients.pezeshk = '1' AND dbo.patients.nos_date_miladi BETWEEN '1392/01/01' AND '1392/05/01'
)d
where rnk = 1
الان Order by nos_date_miladi رو کجا باید بذارم که رکورد ها بر اساس تاریخ ها مرتب شوند ؟
NasimBamdad
شنبه 23 شهریور 1392, 22:17 عصر
وقتی بعد از WHERE که شرط کوری ام هست می ذارم این اررور رو میده
Msg 1033, Level 15, State 1, Line 12
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
محمد سلیم آبادی
یک شنبه 24 شهریور 1392, 12:08 عصر
باید order by را بعد از where بیرونی قرار بدین.
این را امتحان کنید:
select serial, nos_date, expr_date, fname, lname
from
(
SELECT dbo.patients.serial, dbo.patients.nos_date, dbo.patients.expr_date, dbo.patients.fname, dbo.patients.lname,dbo.patients.nos_date_miladi
, row_number() over(partition by dbo.patients.serial, dbo.patients.nos_date_miladi order by dbo.patients.nos_date_miladi) as rnk
FROM dbo.patients INNER JOIN
dbo.pezeshk ON dbo.patients.pezeshk = dbo.pezeshk.id INNER JOIN
dbo.experty ON dbo.pezeshk.experty_code = dbo.experty.id
WHERE dbo.patients.bime = '2' AND dbo.patients.khadamat_type = '1' AND dbo.patients.pezeshk = '1' AND dbo.patients.nos_date_miladi BETWEEN '1392/01/01' AND '1392/05/01'
)d
where rnk = 1
order by nos_date_miladi
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.