View Full Version : مشکل در نوشتن یک Query؟؟
ab_ir_007
چهارشنبه 06 مرداد 1389, 01:40 صبح
دوستان سلام
من قصد دارم از با اطلاعات 3 تا جدول موجودم گزارشی را در جدول چهارمی پر کنم البته در جدول چهارم فقط کلیدها وجود داشته باشد (int) و بعدا بتونم از طریق سه جدول قبلی اطلاعات کامل را بازیابی کنم
مثال / جدول اول نام کالا - جدول دوم وضعیت کالا - جدول سوم نام سرپرست
و جدول چهارم وضعیت روزانه کالا ها که میخوام گزارش کنم به شکل زیر(هشت فیلد دارد همه از نوع int)
ReportID-Kala1-Status-Kala2-status-Kala3-Status-SarparastName
حالا اگر بخواهم مثلا رکورد دوم جدول شماره 4 نمایش داده بشه با استفاده از جداول 1 الی 3 چطور باید کد sql بنویسم؟
محمد سلیم آبادی
چهارشنبه 06 مرداد 1389, 13:22 عصر
سلام،
شما ظاهرا قصد دارین عمل Cross Tab را انجام بدین. به مقاله های زیر رجوع کنید:
http://www.30sharp.com/ShowArticle.aspx?nid=13&did=214&AuthorID=11
http://www.30sharp.com/ShowArticle.aspx?nid=13&did=207&AuthorID=11
اگر نتونستین با کمک این مقاله ها مشکلتون را حل کنید. لطفا یک نمونه از داده های هر سه جدول قرار بدین و اینکه از چه نسخه ی SQL Server در حال استفاده هستین.
ab_ir_007
پنج شنبه 07 مرداد 1389, 14:33 عصر
سلام،
شما ظاهرا قصد دارین عمل Cross Tab را انجام بدین. به مقاله های زیر رجوع کنید:
http://www.30sharp.com/ShowArticle.aspx?nid=13&did=214&AuthorID=11
http://www.30sharp.com/ShowArticle.aspx?nid=13&did=207&AuthorID=11
اگر نتونستین با کمک این مقاله ها مشکلتون را حل کنید. لطفا یک نمونه از داده های هر سه جدول قرار بدین و اینکه از چه نسخه ی SQL Server در حال استفاده هستین.
با سلام و تشکر از راهنمايي شما
راستش من لينکها رو مطالعه کردم گرچه پيچيده بود ولي فکر ميکنم تو سناريوي مورد نظرم کارايي نداشته باشه من يه تصوير از انچه ميخواهم اپلود ميکنم
http://0k.04.img98.com/out.php/i203099_diagr.jpg
به عنوان مثال من يه جدول دارم که نام سرويسها رو شامل ميشه مثل dns و mail و network و جدول ديگه شامل وضعيت سرويسها است مثل high , medium و low و در آخر هم يه جدول گزارشات که براساس id دو جدول قبلي پر شده مثلا رکورد سوم 3،1،2،2،1 و رکورد چهارم 4،1،3،3،1 پر شده.
الان چيزي که دنبالش هستم يه query هست که بتونه به ازاي مثلا دو رکورد 3 و 4 يه چيزي مثل 3،dns،medium،mail،high دقيقا شبيه انچه در جدول اخر ميبينيد بهم نشون بده
البته تو اين مثال از يه جدول ديگه که نام کاربر بوده فعلا صرف نظر کردم
ضمنا من sql2008 دارم
با تشکر
محمد سلیم آبادی
پنج شنبه 07 مرداد 1389, 15:00 عصر
جدول گزارشات را با دو جدول دیگه به اندازه کافی JOIN می کنیم. من جدول سرویس ها را Ser و جدول وضعیت ها را Sta و جدول سوم را Rep در نظر می گیرم. البته نام ستون ها ممکنه با نام های شما همخوانی نداشته باشه که باید اصلاحشون کنید.
SELECT report_id, Ser1.services_name, Sta1.status_name, Ser2.services_name, Stat2.status_name
FROM Rep R
JOIN Ser Ser1
ON R.service_id1 = Ser1.service_id
JOIN Ser Ser2
ON R.service_id2 = Ser2.service_id2
JOIN Sta Sta1
ON R.status_id1 = Sta1.status_id
JOIN Sta Sta2
ON R.status_id2 = Sta2.status_id;
ab_ir_007
پنج شنبه 07 مرداد 1389, 20:04 عصر
جدول گزارشات را با دو جدول دیگه به اندازه کافی JOIN می کنیم. من جدول سرویس ها را Ser و جدول وضعیت ها را Sta و جدول سوم را Rep در نظر می گیرم. البته نام ستون ها ممکنه با نام های شما همخوانی نداشته باشه که باید اصلاحشون کنید.
SELECT report_id, Ser1.services_name, Sta1.status_name, Ser2.services_name, Stat2.status_name
FROM Rep R
JOIN Ser Ser1
ON R.service_id1 = Ser1.service_id
JOIN Ser Ser2
ON R.service_id2 = Ser2.service_id2
JOIN Sta Sta1
ON R.status_id1 = Sta1.status_id
JOIN Sta Sta2
ON R.status_id2 = Sta2.status_id;
دوست من سلام و تشکر از پاسخ سریع شما
راستش این query شما خطا گرفت
من خودم به این شکل نوشتم البته برای سه فیلد اول جدول Report
SELECT Reports.RId,Services.SName,Status.StName
FROM Reports
JOIN Services
ON Reports.Sid1=Services.SId
JOIN Status
ON Reports.Stid1 =Status.StId
تو این کد اگه Report را با یه نام بخوام معرفی کنم ایراد میگیره
SELECT Reports.RId,Services.SName,Status.StName
FROM Reports R
JOIN Services
ON Reports.Sid1=Services.SId
JOIN Status
ON Reports.Stid1 =Status.StId
Msg 4104, Level 16, State 1, Line 4
The multi-part identifier "Reports.Sid1" could not be bound.
Msg 4104, Level 16, State 1, Line 6
The multi-part identifier "Reports.Stid1" could not be bound.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "Reports.RId" could not be bound.
همینطور برای نامگذاری مجدد سایر جداول هم خطا میگیره
اما تا اینجا من فقط سه تا فیلد اولو بازیابی کردم آیا منظورتون اینه که در query باید از نامهای مختلفی استفاده کنم تا بتونم کلیه فیلدهای جدول را با استفاده از JOIN بازیابی کنم؟
لطفا در مورد مشکل خطای Execute هم توضیح بدین (SQL SERVER 2008 Enterprise)
با تشکر
محمد سلیم آبادی
پنج شنبه 07 مرداد 1389, 20:13 عصر
عزیزم طبق همون الگویی که معرفی کردم بایستی عمل کنید. تنها نام شناسه های اصلی را با نام هایی که قرار دادم جابجا کنید. پیغام هایی که داده میشه به خاطر این هست که شما به جدول Reports نام مستعار R دادین ولی از آن نام در کوئری استفاده نکرین بجاش همون نام اصلی را قرار دادین که این اشتباه است.
همانطوری که به ستونها می توانیم نام مستعار بدیم، برای جداول نیز همین کار را می تونیم بکنیم. ولی زمانی که نام مستعار به جدول میدین باید در همه جا از نام مستعار بجای نام اصلی استفاده کنید.
ab_ir_007
پنج شنبه 07 مرداد 1389, 20:25 عصر
MSALIM عزیز سلام
با تشکر از راهنمایی شما بالاخره مشکل حل شد البته بدون کمکتون امکانپذیر نبود بازم تشکر میکنم, مشکل سینتکس داشتم اما در نهایت به این شکل شد:
SELECT R.RId,Sr1.SName,St1.StName,Sr2.SName,St2.StName,Sr 3.SName,St3.StName
FROM Reports R
JOIN Services Sr1
ON R.Sid1=Sr1.SId
JOIN Status St1
ON R.Stid1 =St1.StId
JOIN Services Sr2
ON R.Sid2=Sr2.SId
JOIN Status St2
ON R.Stid2 =St2.StId
JOIN Services Sr3
ON R.Sid3=Sr3.SId
JOIN Status St3
ON R.Stid3 =St3.StId
با تشکر از شما مدیر عزیز
محمد سلیم آبادی
جمعه 08 مرداد 1389, 00:10 صبح
اگر تمایل به استاندارد و نرمال کار کردن دارین باید بگم که این جدول غیر نرمال هست. برای نرمال کردن آن باید عمل Unpivoting را انجام بدین و زمان نمایش اطلاعات عمل Cross Tabulation.
اگر علاقه مند بودین که Schema و ساختار جدول را نرمال کنید بگید تا یک تکنیک موثر برای Unpivoting Multiple Column ارائه بدم.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.