Select PP.cf$_purchase_cat1_desc Purch_Category1_Desc,
       IP.Part_NO,
       IP.Note_Text Legacy,
       IP.DESCRIPTION,
       IP.Contract Site,
       INV.Warehouse,
       sum(SMA.QTY_REQUIRED) Qty_required,
       nvl(INV.QtyOnHand, 0) "Qty on Hand",
       nvl(INV.QtyAvailable, 0) "Qty Available"

  From SHOP_MATERIAL_ALLOC_uiv SMA
 inner join INVENTORY_PART IP
    on SMA.PART_NO = IP.PART_NO
   and SMA.CONTRACT = IP.CONTRACT
  left join PURCHASE_PART_cfv PP
    on IP.Part_No = PP.Part_No
   and IP.Contract = PP.Contract

  left join (select PART_NO,
                    CONTRACT,
                    Warehouse,
                    sum(QTY_ONHAND) QtyOnHand,
                    sum(QTY_ONHAND) - sum(QTY_RESERVED) QtyAvailable
               from Inventory_Part_in_Stock_uiv
              where AVAILABILITY_CONTROL_ID is null
              Group By Contract, PART_NO, CONTRACT, Warehouse) INV
    on SMA.Part_No = INV.PART_NO
   and SMA.Contract = INV.Contract

 Where IP.CONTRACT LIKE '%&CONTRACT%'
   and report_sys.parse_parameter(PP.cf$_purchase_part_cat_1,
                                  '&[-C-BL]PurchasedCategory') = 'TRUE'
   and SMA.State not in ('Cancelled', 'Closed', 'Planned')
   and trunc(SMA.DATE_REQUIRED) between TO_DATE('&DATE_FROM', 'YYYY-MM-DD') AND
       TO_DATE('&DATE_TO', 'YYYY-MM-DD')

 Group by IP.Part_NO,
          PP.cf$_purchase_cat1_desc,
          IP.Note_Text,
          IP.Contract,
          INV.Warehouse,
          IP.DESCRIPTION,
          INV.QtyOnHand,
          INV.QtyAvailable

Having sum(SMA.QTY_REQUIRED) > 0

Order by IP.Part_NO