بهترین سرمایه گذاری دنیا سرمایه گذاری رو خودته! 😉
مانده تا پایان تخفیف
مشاهده دوره‌ها
0

گزارش از دو جدول در یک دستور Select در SQL Server

باسلام و احترام خدمت دوستان عزیز ، من یک جدول به نام T دارم که در آن خدماتی که برای مشتری انجام شده ثبت می شود و دارای فیلد های Id و Name و sharh هست. یک جدول دیگری به نام L نیز وجود دارد که اگر قطعه ای استفاده شود در آن ثبت می شود و دارای فیلدهای Cod و NameVasileh و IdT که فیلد IdT کلید خارجی Id در جدول T می باشد.

در اصل جداول T و L و خروجی به صورت زیر باشد

باسلام و احترام خدمت دوستان عزیز ، من یک جدول به نام T دارم که در آن خدماتی که برای مشتری انجام شده ثبت می شود و دارای فیلد های Id و Name و sharh هست. یک جدول دیگری به نام L نیز وجود دارد که اگر قطعه ای استفاده شود در آن ثبت می شود و دارای فیلدهای Cod و NameVasileh و IdT که فیلد IdT کلید خارجی Id در جدول T می باشد.

در اصل جداول T و L  و خروجی به صورت زیر باشد

||https://tosinso.com/files/get/f87cb0aa-860b-4bba-872f-7422d3cee6ec||

من در SQL Server کد را به صورت زیر می نویسم
select ID ,Name ,Sharh ,COUNT(Idt) from T ,L where T.ID=L.IdT  GROUP BY ID ,Name ,Sharh

ولی در خروجی مورد نظر من اطلاعات مربوط به ID شماره 3 در جدول T را نمایش نمی دهد. علت چیست؟
در اصل برای فرد شماره 3 هیچ قطعه ای استفاده نشده و باید صفر درنظر گرفته شود ولی با این کد من اصلا نمایش نمی دهد.
باتشکر از راهنمایی شما دوستان عزیز

من در SQL Server کد را به صورت زیر می نویسم

select ID ,Name ,Sharh ,COUNT(Idt) from T ,L where T.ID=L.IdT GROUP BY ID ,Name ,Sharh

ولی در خروجی مورد نظر من اطلاعات مربوط به ID شماره 3 در جدول T را نمایش نمی دهد. علت چیست؟

در اصل برای فرد شماره 3 هیچ قطعه ای استفاده نشده و باید صفر درنظر گرفته شود ولی با این کد من اصلا نمایش نمی دهد.

باتشکر از راهنمایی شما دوستان عزیز

پرسیده شده در 1397/07/23 توسط

2 پاسخ

0

خب ، نوع select ای که شما نوشتید اینجوریه که فقط ردیف هایی رو میاره که تو هر دو جدول دارای رکورد باشند ، (در واقع کد داره درست کار می کنه )

اگر می خواین یه جدول به صورت کامل بیاد باید از Outter Join استفاده کنید که بگید یک جدول بدون ملاحظه داشتن یا نداشتن رکورد تو جدول دیگه بیاد.

ضمنا برای جمع باید Count رو به SUM تغییر بدید.

select ID ,Name ,Sharh ,sum(Idt) from T LEFT OUTER JOIN L ON  T.ID=L.IdT GROUP BY ID ,Name ,Sharh 

اما نکته مهمتر اگر می خواید این پروژه رو به محیط واقعی ببرید ، بهتره دیتابیس رو دقیق تر طراحی کنید.

مثلا یک جدول مخصوص تعریف افراد ، یک جدول برای نوع و کد وسیله ها باشه. (چون اینها ثابتند )

بعد جدول سوم میاد میگه فرد 1 ، وسیله 2 ، تعداد 3 تا مصرف شده و شرح رو هم میده.

این جوری هم حجم جداول کم میشه و هم به روز رسانی و گزارش ها دقیق میشه.

پاسخ در 1397/07/23 توسط
0

سلام به شما دوست عزیز.

این به این دلیل است که id شماره 3 در جدول L وجود ندارد. برای این که این رکورد هم در جواب شما بیاید شما باید از left outer join استفاده کنید به شکل زیر

select ID ,Name ,Sharh ,COUNT(Idt) 
from T
left outer join L on T.ID=L.IdT
  GROUP BY ID ,Name ,Sharh 
پاسخ در 1397/07/23 توسط

پاسخ شما