PDA

View Full Version : Quary در دو جدول



goodlife
چهارشنبه 29 اردیبهشت 1389, 11:23 صبح
با سلام به همه دوستان!! من در حال پیاده سازی سیستمی مربوط به شرکت کاریابی هستم.
درون بانکم دو جدول وجود داره، یکی جدول اطلاعات شخصی و دیگری مهارت ها.
ارتباط بین این دو جدول از طریق کد ملی برقرار میشه. و خب طبیعیه هر فردی میتونه چند تا مهارت داشته باشه (به این معنا که درون جدول مهارت ها دارای چند رکورد باشه).
خب حالا من می خوام یک Query بنویسم که اگر فردی دارای چند مهارت بود، دیگه چند تا سطر نشون داده نشه، بلکه مهارتها در قالب ستون های جدید آورده بشه.
مثلا به شکل زیر:
کدملی_____نام خانوادگی____مهارت 1 ________مهارت 2 ________مهارت 3 ______و الی آخر
.
از دوستان اگر کسی تجربه این کار رو داشته لطف کنه اطلاعاتش رو در اختیار من قرار بده ممنون میشم.
سپاس فراوان پیشاپیش.:لبخندساده:

goodlife
چهارشنبه 29 اردیبهشت 1389, 11:33 صبح
ببینید من میخوام از این Query توی Desktop Application استفاده کنم.

ricky22
چهارشنبه 29 اردیبهشت 1389, 11:35 صبح
از چه زبانی استفاده می کنید؟
می تونید دیتا تیبیل بسازید در دات نت و با select گرفتن از مهارت ها اونا رو به عنوان یک column به دیتاتیبل اضافه کنید

goodlife
چهارشنبه 29 اردیبهشت 1389, 12:18 عصر
نه دوست عزیز این که شما گفتید دوباره همون خروجی را میده. اگر بخوام مساله رو بهتر توضیح بدم، باید بگم که، اگر مثلا فقط یک سطر درون جدول مهارت با کد ملی 13 وجود داشت که هیچ، خب خروجی به شکل زیر خواهد بود:
کدملی | مهارت
13 |برنامه نویسی
حالا اگه فردی با کدملی 13 دارای سه مهارت باشه، خروجی این شکلی میشه:
کدملی | مهارت
13 |برنامه نویسی
13 |شبکه
13|تعمیرات
که این دومی مطلوب من نیست. من میخوام به شکل زیر در بیاد:
کدملی | مهارت 1|مهارت 2|مهارت 3
13 |برنامه نویسی |شبکه|تعمیرات

راستش بعید می دونم که با Query بشه همچین چیزی رو انجام بدم.
در ضمن من با C#.NET کار می کنم و SQL 2005
سپاس

goodlife
چهارشنبه 29 اردیبهشت 1389, 12:25 عصر
خب اینکه شما گفتید ممکنه در مورد یک کاربر جواب بده. یعنی بعد از انجام Query بیایم تعداد سطرهای DataTable رو بشماریم و حالا اگه بیشتر از یک بود، بیاد اون ها درون ستون هایی که ما درون DataTable تعیین می کنیم، قرار بده. اما
شما فرض کنید صفحه ای دارید که قراره کل افرادی که جویای کار هستند رو نمایش بده.
خب این افراد همون طور که گفتم میتونید چند مهارت داشته باشن، من باید کاری کنم که در مورد همه افراد این قضیه به وجود بیاد که اگه تعداد مهارت هاشون بیشتر از یک بود، دیگه اونها در دو سطر نمایش داده نشن، بلکه مهارت های دوم و سوم و ... در ستون های بعدی نمایش داده شن
ممنون از جوابتون.

محمد سلیم آبادی
چهارشنبه 29 اردیبهشت 1389, 19:27 عصر
SELECT Code_Melli, STUFF((SELECT ','+Maharat
FROM table_name t2
WHERE t1.Code_Melli = t2.Code_Melli
FOR XML PATH('')),1,1,'') AS Skills_List
FROM (SELECT DISTINCT Code_Melli FROM table_name) AS t1;

محمد سلیم آبادی
پنج شنبه 30 اردیبهشت 1389, 09:35 صبح
سلام و ممنون بخاطر پاسخ
فقط امکانش هست که این کد رو کمی توضیح بدید
مثلا دستور For XML Path ؟؟؟

از FOR XML PATH برای الحاق سطرهای جدول استفاده شده است.
http://www.30sharp.com/ShowArticle.aspx?nid=13&did=214&AuthorID=11

amir_alaki
پنج شنبه 30 اردیبهشت 1389, 13:26 عصر
با سلام

من خودم موردی مشابه داشتم البته در سیستم حقوق دستمزد بود ، برای جابجا کردن سطر ها به صورت ستون از Pivote استفاده کردم ،فکر کنم در مورد مسئله شما هم شاید کمک کنه برای مثال هم میتونین لینک زیر رو ببینین :
http://www.unboxedsolutions.com/sean/archive/2004/08/30/302.aspx
موفق باشید

محمد سلیم آبادی
پنج شنبه 30 اردیبهشت 1389, 13:31 عصر
با سلام

من خودم موردی مشابه داشتم البته در سیستم حقوق دستمزد بود ، برای جابجا کردن سطر ها به صورت ستون از Pivote استفاده کردم ،فکر کنم در مورد مسئله شما هم شاید کمک کنه برای مثال هم میتونین لینک زیر رو ببینین :
http://www.unboxedsolutions.com/sean/archive/2004/08/30/302.aspx
موفق باشید

سلام دوست من،
PIVOT در این مورد سفارش نمیشه. زیرا ممکنه کاربر بخواهد داده های N سطر (که متغیر هست) را الحاق کند. و همچنین نیاز به تابع ROW_NUMBER نیز وجود خواهد داشت و در نهایت با وجود روش های ساده تری چون FOR XML PATH و Recursive CTE که برای تمام سناریو ها جواب می دهند PIVOT اصلا سفارش نمی شود.

می توانید به این مقاله رجوع کنید:
http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/