گزارش از دو جدول در یک دستور Select در SQL Server
باسلام و احترام خدمت دوستان عزیز ، من یک جدول به نام T دارم که در آن خدماتی که برای مشتری انجام شده ثبت می شود و دارای فیلد های Id و Name و sharh هست. یک جدول دیگری به نام L نیز وجود دارد که اگر قطعه ای استفاده شود در آن ثبت می شود و دارای فیلدهای Cod و NameVasileh و IdT که فیلد IdT کلید خارجی Id در جدول T می باشد.
در اصل جداول T و L و خروجی به صورت زیر باشد
من در 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 هیچ قطعه ای استفاده نشده و باید صفر درنظر گرفته شود ولی با این کد من اصلا نمایش نمی دهد.
باتشکر از راهنمایی شما دوستان عزیز
2 پاسخ
خب ، نوع 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 تا مصرف شده و شرح رو هم میده.
این جوری هم حجم جداول کم میشه و هم به روز رسانی و گزارش ها دقیق میشه.
سلام به شما دوست عزیز.
این به این دلیل است که 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