View Full Version : حرفه ای: یک کوئری تو در تو
h_arman
جمعه 11 تیر 1389, 21:44 عصر
سلام بر دوستان
من دو روز آخر این هفته را روی این مطلب که الان میخوام بپرسم گذاشتم. مطالب زیادی را یاد گرفتم ولی متاسفانه به جواب سوالم نرسیدم.
من یک جدول دارم با حدود ده تا فیلد. یکی از فیلدها کد شهر بنام ctID_fk . همونطور که از اسمش پیداست این فیلد فیلد کنید جدول نیست و ممکنه مقادیر تکراری از اون توی رکوردهای مختلف وجود داشته باشه.
و یک فیلد وضعیت بنام Status که بطور پیش فرض صفر است و پس از تغییر از طرف کاربر یکی از مقادیر 1 یا 2 را میگیرد.
حالا من میخوام با یه دستور Select یه رکوردست برگردونم که سه تا فیلد داشته باشه:
1- کد شهر
2- تعداد رکوردهایی با این کد شهر که مقدار فیلد Status اونها برابر 1 است
3- تعداد رکوردهایی با این کد شهر که مقدار فیلد Status اونها برابر 2 است
اون چیزی که مسلمه اینه که باید روی کد شهر گروپ داشته باشم و روی فیلد وضعیت کانت. همچنین اونایی که وضعیتشون صفره را نباید بشمرم.
تا اونجایی که من فهمیدم باید از Select های تودرتو معروف به SubQuery یا Nested Query استفاده کنم .ولی متاسفانه نتونستم راهش را پیدا کنم.
از اینکه وقت گذاشتید و خوندید ممنونم
svahidm
شنبه 12 تیر 1389, 12:24 عصر
سلام
اول اينكه هر دو فيلد شماره 2 و 3 شما يكيه ؟؟؟؟؟
ثانيا شما ميتونين از group by به راحتي براي اين قضيه استفاده كنين حالا چرا به اين نتيجه رسيدين كه از nested select يا غيره استفاده كنين يه كم نامفهومه ،اگه ممكنه بيشتر توضيح بدين
L_eskandary
شنبه 12 تیر 1389, 13:17 عصر
سلام دوست عزیز
سوال مورد نظر شما بدون nested queryهم قابل حل است . حالا اگر شما به این امر تعصب نداشته باشین ، این هم پاسخ شما :
select cityid ,status, count(cityid) from city where cityid='1' group by cityid ,status having status='1' or status='2'
البته شرط whereرا شما می توانید با کدهای شهر موجود در پایگاه داده تان جایگزین کنید . و در صورتی هم که می خواهید لیست همه شهر ها را ببینید کافی است شرط whereرا حذف کنید.
به همین سادگی ...
موفق باشین.
h_arman
شنبه 12 تیر 1389, 15:04 عصر
where cityid='1' group by cityid
آخه عزیز دل من قربون اون شکل ماهت اگه وقت نداری سوال را درست بخونی پس از کجا وقت میاری جواب بدی
آخه این جواب شما جدای از اینکه درست باشه یا نه که حداکثر یه سطر برمیگردونه اونم به شرطی که یه شهر با کد 1 وجود داشته باشه
خواهش میکنم یکم دقت کنید
بهرحال از لطفتون ممنونم
محمد سلیم آبادی
شنبه 12 تیر 1389, 15:48 عصر
دوست عزیزم،
- تعداد رکوردهایی با این کد شهر که مقدار فیلد Status اونها برابر 1 است
3- تعداد رکوردهایی با این کد شهر که مقدار فیلد Status اونها برابر 1 است
در توضیحات شما وضعیت ها هر دو برابر با 1 هستند. ولی من فکر می کنم باید وضعیت دومی به 2 تغییر کنه. با این حساب لطفا این روش را امتحان کنید. از subquery خیلی خیلی موثر تر و کاربردی تر هست:
SELECT Ctid_fk,
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS cnt_status_1,
SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) AS cnt_status_2
FROM table_name
GROUP BY ctid_fk ;
h_arman
شنبه 12 تیر 1389, 16:14 عصر
سلام
اول اينكه هر دو فيلد شماره 2 و 3 شما يكيه ؟؟؟؟؟
ثانيا شما ميتونين از group by به راحتي براي اين قضيه استفاده كنين حالا چرا به اين نتيجه رسيدين كه از nested select يا غيره استفاده كنين يه كم نامفهومه ،اگه ممكنه بيشتر توضيح بدين
دوست عزیزم،
در توضیحات شما وضعیت ها هر دو برابر با 1 هستند. ولی من فکر می کنم باید وضعیت دومی به 2 تغییر کنه. با این حساب لطفا این روش را امتحان کنید. از subquery خیلی خیلی موثر تر و کاربردی تر هست:
SELECT Ctid_fk,
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS cnt_status_1,
SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) AS cnt_status_2
FROM table_name
GROUP BY ctid_fk ;
آخ الهی من قربون اون دهنت برم که فقط ازش در و گوهر میباره.
کجا بودی دیشب تا حالا؟ واقعا که اگر شنونده عاقل باشه حتی اشکال سوال کننده را هم متوجه میشه
من کاملا مبهوت شدم. خیلی دمت گرم
ما را به شاگردی بپذیر. به خدا جدی می گم. اگه قبول کنی قول میدم هفته ای 10 دقیقه بیشتر مزاحمت نشم
موفق باشی
منتظرم
L_eskandary
شنبه 12 تیر 1389, 17:00 عصر
آخه این جواب شما جدای از اینکه درست باشه یا نه که حداکثر یه سطر برمیگردونه اونم به شرطی که یه شهر با کد 1 وجود داشته باشه
فک کنم شما اصلا پاسخ من رو تا آخرش نخوندین، چون این مسئله رو نوشتم...:قهقهه:
بعدش هم اگه فرصت کردین یه بار query رو بنویسین و اجراش کنین!
شما سوال کردین که کد شهر رو می خواین با تعداد وضعیت های 1 و 2 متعلق به اون کد ، که منم دقیقا همین رو جواب دادن ... والا شاید من سوال رو متوجه نشدم.
h_arman
شنبه 12 تیر 1389, 21:58 عصر
فک کنم شما اصلا پاسخ من رو تا آخرش نخوندین، چون این مسئله رو نوشتم...:قهقهه:
بعدش هم اگه فرصت کردین یه بار query رو بنویسین و اجراش کنین!
شما سوال کردین که کد شهر رو می خواین با تعداد وضعیت های 1 و 2 متعلق به اون کد ، که منم دقیقا همین رو جواب دادن ... والا شاید من سوال رو متوجه نشدم.
به هر حال از لطف و توجه شما ممنونم
h_arman
یک شنبه 13 تیر 1389, 08:05 صبح
دوست عزیز msalim
اگر تو کوئری قبلی بخوام فقط اون سطرهایی بیان که حداقل یکی از فیلدهای Count1 و Count2 بیشتر از صفر باشد باید چیکار کنم؟
خودم هر کاری کردم نشد. اصلا این syntax برام ناآشناست.
کاش میدونستم چطور میتونم یادش بگیرم
h_arman
یک شنبه 13 تیر 1389, 11:22 صبح
msalim جان خودم جوابشو پیدا کردم
یک کتاب هم در مورد T-SQL پیدا کردم که فکر کنم همونیه که دنبالش میگشتم
از لطفت ممنونم
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.