View Full Version : اشکال در استفاده از group by
thuvsrt
جمعه 19 مهر 1387, 14:01 عصر
سلام،من یه query نوشتم که چند تا فیلد رو از چند تیبل مختلف با استفاده از inner join ، select میکنه،میخوام رکورد های تکراری رو نشون نده ، با استفاده از group by نمیتونم این کار رو کنم!چون فقط میخوام بر اساس یه فیلد Group by کنم که نمیشه!اجازه این کار رو نمیده!برای نشون ندادن رکوردهای تکراری چیکار باید کرد؟ممنون میشم راهنمایی کنید یه query خوب بنویسم.به عنوان مثال یه همچین Queryای میخوام بنویسم:
select T1.a,T1.code,T2.b,T3.c from T1 inner join T2 On T1.code=T2.code inner join T3 On T2.code=T3.code where T1.f='true' Group by T1.code
amin_alexi
شنبه 20 مهر 1387, 07:36 صبح
سلام
ميتوني از Destinct استفاده كني !
select Distinct T1.a,T1.code,T2.b,T3.c
from T1 inner join T2 On T1.code=T2.code
inner join T3 On T2.code=T3.code
where T1.f='true' Group by T1.code
thuvsrt
شنبه 20 مهر 1387, 16:47 عصر
ميتوني از Destinct استفاده كني
با تشکر از راهنماییتون،ولی distinct جواب نمیده،اگه میشد که حتما همین کار رو میکردم!
nedata
شنبه 20 مهر 1387, 18:19 عصر
سلام
شما با فیلد دیگری در join می توانید این کار را انجام دهید. چون ساختار جداول را نمی دانم نمی توانم کمک بیشتری کنم
thuvsrt
یک شنبه 21 مهر 1387, 18:04 عصر
شما با فیلد دیگری در join می توانید این کار را انجام دهید. چون ساختار جداول را نمی دانم نمی توانم کمک بیشتری کنم
میشه بیشتر توضیح بدین،متوجه منظورتون نشدم!
whitehat
یک شنبه 21 مهر 1387, 19:25 عصر
با تشکر از راهنماییتون،ولی distinct جواب نمیده،اگه میشد که حتما همین کار رو میکردم!
با این دستور چه فیلدهایی تکرار میشه؟
nedata
یک شنبه 21 مهر 1387, 22:01 عصر
یعنی اینکه شما حتما فیلد دیگری غیر از Code دارید که در جداولتون مشترک هستند پس شرط های join را می توانید زیاد کنید
مثلا اگر فرض کنیم غیر ازCode فیلد Name هم در جداول مشترک باشد اینگونه می نویسیم
Select T1.a,T2.b
From Table1 T1 join Table2 T2 on
T1.code=T2.Code and T1.Name=T2.Name
thuvsrt
دوشنبه 22 مهر 1387, 08:54 صبح
با این دستور چه فیلدهایی تکرار میشه؟
ببینید اطلاعاتی که من میخوام select کنم،شامل یه سری فیلد هست که اطلاعات ثابتی هستند به علاوه چند تا فیلد که متغیر هستند ،مثلا اطلاعات عمومی افراد(نام،نام خانوادگی،نام پدرو...)ثابت هستند ولی یه سری فیلد ها مثلا تعداد آزمون ها تغییر می کند،یعنی یه نفر ممکن است چند تا آزمون مختلف داده باشه!من میخوام یه رکورد نشون بده ،و به ازای هر آزمون یه رکورد با مشخصات کامل شخص نمایش داده نشه،یعنی اگه یه نفر 4 تا آزمون داده ،4 تا رکورد در جدول من با مشخصات اون نفر نشون داده نشه!
یعنی اینکه شما حتما فیلد دیگری غیر از Code دارید که در جداولتون مشترک هستند پس شرط های join را می توانید زیاد کنید
ممکنه فیلد مشترک داشته باشم ،اما میخوام فقط بر اساس یه فیلد join بزنم،چون در غیر این صورت منطق queryام به هم میخوره!
whitehat
دوشنبه 22 مهر 1387, 10:46 صبح
الان هنوز شما جواب سوال منو ندادید؟
اگه رکورد های تکراری دقیقا در تمامی موارد تکرار شدن یعنی دو نماش نتایج دقیقا رکورد هایی با فیلد یکسان دارید با Distinct مشکل حل میشه
اگه باید یک مشخصات یک نفر با مثلا مجموع تعداد آزمونهایی که داده نمایش داده بشه باید از group by استفاده کنید
بهتره برای اینکه به جواب برسید ساختار جدول را با یک مثال از مشکلی که پیش میاد اینجا بنویسید تا راهنمایی کنم
موفق باشید
thuvsrt
دوشنبه 22 مهر 1387, 20:02 عصر
ببینید جداول من به این صورته:
من سه تا جدول دارم که یکی مربوط به اطلاعات عمومی فرد هست مثل نام ونام خانوادگی،شماره شناسنامه،کد ملی و کد مشخصه (که به صورت identity)به هر فرد موقع پذیرش داده میشود،یک جدول هم اطلاعات کامل تر فرد هست مثل سن،تاریخ تولد،تاریخ پذیرش،تاریخ ترخیص وکد مشخصه که به وسیله آن با جدول اول در ارتباطه...،جدول سوم مربوط به اطلاعات تخت وبخش بیمار هست که شامل بخش،تخت،کد مشخصه و...میباشد.
حالا من میخوام اطلاعات بخش وتخت بیمار را با یه شرط خاص نشون بده،اما مشکل اینجاست اگه بیمار چند تا بخش و تخت در جدول سوم داشته باشه،سه رکورد با مشخصات بیمار ،با بخش و تخت های مختلف نشون میده ،یعنی به ازای هر بخش و تختی که گرفته یه سطر از اطلاعات بیمار را نشون میده!من میخوام جلوی این تکرار ها گرفته بشه و فقط یه رکورد برای هر بیمار نشون بده با بخش وتخت مربوط به خودش.
نمیدونم منظورم رو درست رسوندم یا نه!
whitehat
دوشنبه 22 مهر 1387, 20:15 عصر
منظور شما رسید اما کوئری که شما می زنید باید برای هر بیمار مثلا 3 رکورد نشان دهد چون ماهیت آنها با هم فرق می کنند! الان شما می خواهید مثلا برای بیمار N چه اطلاعاتی از جدول سوم نشان داده شود و آیا این اطلاعات تکراری هستند یا خیر؟
thuvsrt
سه شنبه 23 مهر 1387, 17:15 عصر
تکراری نیست،ولی میخوام برای بیمار N، آخرین رکوردی که برای او در جدول سوم ثبت شده ،نمایش داده بشه وقبلی ها رو نشون نده!یعنی نیازی نیست که نشون بده.
whitehat
سه شنبه 23 مهر 1387, 17:34 عصر
پس با این حساب شما باید ابتدا آخرین رکورد هر بیمار را از جدول تخت و بخش بیمار با استفاده از یک group by و مرتب کردن نزولی و گرفتن Top بگیرید و سپس با جدول مشخصات اصلی join کنید
برای نوشتن کوئری احتیاج به مشخصات جدول ها و ارتباط آنها نیاز است :)
موفق باشید
KambizZandi
سه شنبه 23 مهر 1387, 23:57 عصر
1/ 2 تا جدول داريد که يکيش اطلاعات پايه است و اونيکي تکميلي. بنابر اين بايد ارتباط 1 به 1 داشته باشن که اين normal نيست.
2/ فرض کنيم T3 اطلاعات بخش و تخت باشه. اول بايد آخرين سطر اونو در بياريد تا تک سطري بشه:
Select Top 1 T3.* From T3 Order By T3.Date Desc
3/ حالا اينو با T1 و T2 مرتبط کنيد:
Select *
From T1
Inner Join T2
On T2.Code = T1.Code
Left Join (
Select Top 1 T3.* From T3 Order By T3.Date Desc
) tmpT3
On tmpT3.T1Code = T1.Code
توضيح: من چون اسم جداول و فيلدهاي شما رو نميدونستم همينجوري اسم دادم. بقيش با خودتون.
whitehat
چهارشنبه 24 مهر 1387, 10:50 صبح
/ 2 تا جدول داريد که يکيش اطلاعات پايه است و اونيکي تکميلي. بنابر اين بايد ارتباط 1 به 1 داشته باشن که اين normal نيست.
2/ فرض کنيم T3 اطلاعات بخش و تخت باشه. اول بايد آخرين سطر اونو در بياريد تا تک سطري بشه:
کد:
Select Top 1 T3.* From T3 Order By T3.Date Desc
کوئری اول شما فقط یک رکورد میده و اونم آخرین رکوردی هست که وارد شده، در حالی که این دوست ما برای هر بیمار آخرین وضعیت را می خواهد
thuvsrt
چهارشنبه 24 مهر 1387, 16:00 عصر
ممنون از راهنماییتون ،من با روشی که گفتین کوئری میزنم،اگه جواب نداد دوباره میپرسم:چشمک::لبخند:
mannai29
چهارشنبه 24 مهر 1387, 20:45 عصر
سلام دوستان.
رکورد آخری که شما به عنوان تخت برای بیمار خود درج می کنید باید شامل یک مشخصه باشه مثلا یک فیلد Flag . یا اینکه PK اون رکورد بزرگتر از قبلی ها باشه یا ... تا بالاخره شما بتونید تشخیصش بدید که این ، همان رکورد مورد نظر شماست. حال اگر شما مثلا با یک Flag اینکار رو کرده باشید کافیست اون رو در شرط Join خودتون با جدول سوم بیارید: and Flag=1 ...
یا اگر ID یا Date بزرگتر داشته باشه باز هم در شرط Join می نویسید :
join TBL3 t3 on ...
and id=(select max(id) from TBL3 where CodeBimar=t3.CodeBimar)
امیدوارم مفهوم رو گرفته باشید و کمک باشه.
پیروز باشید.
KambizZandi
شنبه 27 مهر 1387, 18:26 عصر
کوئری اول شما فقط یک رکورد میده و اونم آخرین رکوردی هست که وارد شده، در حالی که این دوست ما برای هر بیمار آخرین وضعیت را می خواهد
QUERY اول براي انتقال مفهوم بود و وقتي درست کار ميکنه که در query دوم با group by قرار بگيره. اما چون erd جداول رو دوستمون ندادند بيشتر از اين نتونستم بگم.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.