PDA

View Full Version : مشكل در نوشتن يك كوئري



yalameh
دوشنبه 16 شهریور 1388, 11:21 صبح
سلام مجدد
من يه ديتابيس دارم شامل سه تيبل به نامهاي TLocation كه واحدهاي فيزيكي را نشان مي دهد ، TMachine كه تجهيزات داخل هر واحد را نشان مي دهد و TRepair كه تعميرات صورت گرفته بر روي هر تجهيز را نشا ن مي دهد .


با توجه به محدوده تاريخي كه از كاربر اخذ مي شود بايد گزارشي بر اساس واحدهاي تعريف شده شامل ستونهاي نام واحد ، تعداد كل تجهيزات ، تعداد تجهيزات داراي تعميرات و در نهايت تعداد تجهيزات فاقد تعميرات در محدوده تاريخ مورد نظر ايجاد شود .


فرمت ديتابيس و همچنين نوع گزارش را در فايل پيوست آورده ام .

محمد سلیم آبادی
دوشنبه 16 شهریور 1388, 13:23 عصر
Select D1.LocationName,
C1=IsNull(D1.C1,0),
C2=IsNull(D2.C2,0),
C3=IsNull(D3.C1-D2.C2,0)
From
(
Select LocationID,
LocationName,
C1=Count(MachineID)
From Tlocation tl
Left Outer Join TMachine tm
On tl.LocarionID=tm.LocationID
Group by tl.LocationID
)D1
Left Outer Join
(
Select LocationID,
C2=Count(*)
From TMachine tm
Inner Join TRepair tr
On tm.MachinID=tr.MachinID
Where RepairDate Between '1388/03/01' and '1388/03/30'
Group By LocationID
)D2
On D1.LocationID=D2.LocationID
--Where D2.RepairDate Between '1388/03/01' and '1388/03/30'

yalameh
سه شنبه 17 شهریور 1388, 08:01 صبح
وقتي كوئري را اجرا مي كنم خطاي زير را نشون مي ده :
The column prefix 'D3' does not match with a table name or alias name used in the query

yalameh
سه شنبه 17 شهریور 1388, 08:51 صبح
البته مشكل فوق حل شد . D3 را تبديل به D1 كردم .
يه مشكل ديگه هست اينه كه اگر كاربر توي محدوده تاريخ فوق جهت يك تجهيز دوبار تعمير ثبت كرد به مشكل بر مي خوريم . يعني تعداد تجهيزات داراي تعمير را 2 اعلام مي كند و تجهيزات بدون تعمير را تعداد كل تجهيزات منهاي 2 نشان مي دهد كه اشتباه است . در صورتيكه تعداد تجهيزات داراي تعمير را 1 بايد اعلام مي كند و تجهيزات بدون تعمير را تعداد كل تجهيزات منهاي 1 نشان دهد .
ممنون

محمد سلیم آبادی
سه شنبه 17 شهریور 1388, 10:52 صبح
من از روی آن چیزی که دیدم Query را نوشتم، داخل تصویر چیزی از کلید اصلی و کلید خارجی نگفته است. از روی تصویر پیداست که PK جدول TRepair ستون MachineID است! پس هر ماشینی تنها یکبار ممکن است تعمیر شود.ولی اینگونه که شما دارید می گین پس ترکیب دو ستون موجود در جدول TRepair کلید اصلی است!؟
برای اینکه دقیق Query را بتوانم ایجاد کنم باید به Script جدولتان دست رسی داشته باشم. برای این منظور لطفا از کد وداده های جدولتان Script تهیه کنید و پست کنید(ضمیمه). برای این منظور شما می توانید از Microsoft SQL server database publishing wizard استفاده کنید یا از خود scripts genration برنامه sql.

و بفرمایید که نسخه ی SQL شما چند است 2000/2005 . ممکن است برای راحت تر حل کردن Query از توابع Ranking نیز استفاده شود.

yalameh
سه شنبه 17 شهریور 1388, 12:25 عصر
در مورد sql server ، ورژن 2000 است .
در مورد RepairID ،TRepair كليد اصلي است كه فراموش كردم بيارمش . در عكس آپلود شده جديد اصلاح شد .
توضيح بيشتري بدم اينكه TRepair جدول تعميرات صورت گرفته بر روي تجهيزات است و ممكن است هر تجهيز در تاريخهاي مختلف تعميرات داشته باشد . پس اگر مثلا در محدوده تاريخ وارد شده يك تجهيز داراي بيش از يك تعمير بود بايد آن تعميرات به هر تعداد را يك بار به حساب بياورد .

محمد سلیم آبادی
سه شنبه 17 شهریور 1388, 12:38 عصر
نوشتن Query از روی یک نقاشی باید کار فوقع العاده ای باشد! اینطور نیست؟ (; (چشمک)
خواسته ی مرا انجام ندادید. مشکلی نیست سعی می کنم آن چیزی را که می خواهید در بیارم (:

محمد سلیم آبادی
سه شنبه 17 شهریور 1388, 12:54 عصر
من به Script داده و کد جدولت احتیاج دارم تا بتوانم result کوئری را چک/تست کنم تا یک query صحیح راست پست کنم. اگر script را ارسال نکنید دیگر همکاری نخواهم کرد!
این را تست کنید. (try this one)



Select D1.LocationName,
C1=IsNull(D1.C1,0),
C2=IsNull(D2.C2,0),
C3=IsNull(D1.C1-D2.C2,0)
From
(
Select LocationID,
LocationName,
C1=Count(MachineID)
From Tlocation tl
Left Outer Join TMachine tm
On tl.LocarionID=tm.LocationID
Group by tl.LocationID
)D1
Left Outer Join
(
Select LocationID,
C2=Count(*)
From TMachine tm
Inner Join --I like derived table so so much.
--Using this table is really interstring.
(
Select Distinct MachineID
from TRepair
Where RepairDate Between '1388/03/01' and '1388/03/30'
) as tr
On tm.MachinID=tr.MachinID
Group By LocationID
)D2
On D1.LocationID=D2.LocationID
--Where D2.RepairDate Between '1388/03/01' and '1388/03/30'

yalameh
سه شنبه 17 شهریور 1388, 13:12 عصر
جناب Msalim من هم موقعيت شما را درك مي كنم و شما بايد بر روي ديتابيس كوئرتون را چك كنيد .
با توجه به اينكه تيبل هاي من داراي فيلدها و ركوردهاي خيلي زيادي است كه در اين كوئري ها لازم نيست بيايند . من يك ديتابيس مثل ديتابيس خودم با تيبل ها و فيلدهاي ضروري ايجاد كردم و نمونه اي از داده ها را ثبت كردم و پيوست نمودم . اميدوارم كه بتونه كمكمون كنه .

محمد سلیم آبادی
سه شنبه 17 شهریور 1388, 13:32 عصر
جناب Msalim من هم موقعيت شما را درك مي كنم و شما بايد بر روي ديتابيس كوئرتون را چك كنيد .
با توجه به اينكه تيبل هاي من داراي فيلدها و ركوردهاي خيلي زيادي است كه در اين كوئري ها لازم نيست بيايند . من يك ديتابيس مثل ديتابيس خودم با تيبل ها و فيلدهاي ضروري ايجاد كردم و نمونه اي از داده ها را ثبت كردم و پيوست نمودم . اميدوارم كه بتونه كمكمون كنه .
اینگونه که پیداست شما هنوز با تولید script از داده ها و جداولتان آشنا نیستید. پیشنهاد می کنم که تاپیک ضمیمه شده ی تالار که با عنوان "چگونه داده ...." را مطالعه کنید.
شما فایل MDF را ارسال کردید که حجم بالایی دارد، در واقع Script یک متن است و حجم کمی نیز دارد و با اجرای (execute) آن جدول و داده های آن ایجاد می شوند.

yalameh
چهارشنبه 18 شهریور 1388, 15:42 عصر
گوش شيطون كر باشه ، انگاري همون كوئري بالائي جواب داد . من روي داده هاي مختلفي چك كردم و گزارشم تهيه شد . ممنونم . اگه موردي بود باز مزاحمتون مي شم