2016-08-05 2 views
0

У меня есть список деталей от поставщика, и я хочу посмотреть, что мы купили и продали с 1 января. Я создал подзапросы для информации о продажах и покупке.Как исключить строки, когда все коррелированные подзапросы возвращаются Нуль

Есть четыре варианта в результатах:

  1. Sales Количество = Покупка Количество
  2. Sales Количество> Покупка Количество (включая NULL Purchase количество)
  3. Sales Количество < Покупка Количество (включая NULL Sales Количество)
  4. Оба объема продаж и приобретения являются NULL

Как исключить строки, когда количество продаж и покупки равно NULL, при сохранении этих строк, которые могут иметь NULL Sales Quantity или Purchase Quantity? Для иллюстрации примеров этих сценариев прилагается изображение.

Я рассмотрел this поток, но он, похоже, не применяется, потому что мои столбцы не обязательно должны быть равными.

SELECT DISTINCT  
p21_view_supplier.supplier_id AS [Supp ID], 
p21_view_supplier.supplier_name AS Supplier, 
p21_view_inv_mast.item_id AS [Item ID], 
p21_view_inv_mast.item_desc AS [Item Desc], 
p21_view_inv_loc.location_id AS [Location ID], 
invoice_data.[Total Shipped by Sales Loc], 
purchase_data.[PO Qty Ordered] 

FROM    
p21_view_supplier 
INNER JOIN p21_view_inventory_supplier ON p21_view_supplier.supplier_id = p21_view_inventory_supplier.supplier_id 
INNER JOIN p21_view_inv_mast ON p21_view_inventory_supplier.inv_mast_uid = p21_view_inv_mast.inv_mast_uid 
INNER JOIN p21_view_inv_loc ON p21_view_inv_mast.inv_mast_uid = p21_view_inv_loc.inv_mast_uid 
--Invoices 
LEFT JOIN (
    SELECT   
    p21_view_invoice_hdr.sales_location_id, 
    p21_view_invoice_line.item_id, 
    p21_view_invoice_line.supplier_id, 
    p21_view_invoice_line.inv_mast_uid, 
    SUM(p21_view_invoice_line.qty_shipped) AS [Total Shipped by Sales Loc] 

    FROM    
    p21_view_invoice_hdr 
    INNER JOIN p21_view_invoice_line ON p21_view_invoice_hdr.invoice_no = p21_view_invoice_line.invoice_no 

    WHERE   
    (p21_view_invoice_hdr.invoice_date >= CONVERT(DATETIME, '2016-01-01 00:00:00', 102)) 

    GROUP BY 
    p21_view_invoice_hdr.sales_location_id, 
    p21_view_invoice_line.item_id, 
    p21_view_invoice_line.supplier_id, 
    p21_view_invoice_line.inv_mast_uid 
    ) invoice_data ON p21_view_supplier.supplier_id = invoice_data.supplier_id 
     AND p21_view_inv_mast.inv_mast_uid = invoice_data.inv_mast_uid 
     AND p21_view_inv_loc.location_id = invoice_data.sales_location_id 
--Purchasing 
LEFT JOIN (
    SELECT   
    p21_view_po_hdr.supplier_id, 
    p21_view_po_hdr.location_id AS [PO Loc ID], 
    SUM(p21_view_po_line.qty_ordered) AS [PO Qty Ordered], 
    p21_view_po_line.item_id AS [Item ID], 
    p21_view_po_line.inv_mast_uid 

    FROM    
    p21_view_po_hdr 
    INNER JOIN p21_view_po_line ON p21_view_po_hdr.po_no = p21_view_po_line.po_no 

    WHERE   
    (p21_view_po_hdr.date_created >= CONVERT(DATETIME, '2016-01-01 00:00:00', 102)) 
    AND (p21_view_po_hdr.delete_flag IS NULL OR 
          p21_view_po_hdr.delete_flag = 'N') 
    AND (p21_view_po_line.delete_flag IS NULL OR 
          p21_view_po_line.delete_flag = 'N') 
    AND (p21_view_po_line.cancel_flag IS NULL OR 
          p21_view_po_line.cancel_flag = 'N') 
    AND (p21_view_po_hdr.cancel_flag IS NULL OR 
          p21_view_po_hdr.cancel_flag = 'N') 

    GROUP BY 
    p21_view_po_hdr.supplier_id, 
    p21_view_po_hdr.location_id, 
    p21_view_po_line.item_id, 
    p21_view_po_line.inv_mast_uid 
    ) purchase_data ON p21_view_supplier.supplier_id = purchase_data.supplier_id 
     AND p21_view_inv_mast.inv_mast_uid = purchase_data.inv_mast_uid 
     AND p21_view_inv_loc.location_id = purchase_data.[PO Loc ID] 

WHERE   
(p21_view_supplier.supplier_id = 8761) 
AND (p21_view_inv_mast.delete_flag = 'N') 

ORDER BY 
p21_view_inv_mast.item_id, 
p21_view_inv_loc.location_id 
+0

предполагая, что я понял вопрос и предполагая supplier_id не обнуляемые колонки, почему бы не просто добавить в вашем внешний, где пункт 'и NOT (purchase_data.supplier_id является недействительным и invoice_data.supplier_id равно нуль)'? –

+0

@ ZoharPeled, спасибо, что решил! Я должен был подумать об этом ... – dmatthew

+0

Рад помочь! Я позже напишу свой комментарий к ответу, чтобы вы могли его ускорить и сообщить людям, что проблема решена. –

ответ

0

Предполагая, что есть по крайней мере один не обнуляемый столбец в обеих производных таблицах, вы можете просто добавить условие внешнего запроса, в котором пункт, который будет оценивать истинный только тогда, когда по крайней мере один из не Nullable столбцы в производных таблицах не равны нулю.

В этом случае, я предполагаю, что ненулевая колонна является одинаковой для обоего производных таблиц и это supplier_id, поэтому я добавляю к где п следующее условие:

AND NOT (purchase_data.supplier_id is null and invoice_data.supplier_id is null) 

Полный запрос :

SELECT DISTINCT  
p21_view_supplier.supplier_id AS [Supp ID], 
p21_view_supplier.supplier_name AS Supplier, 
p21_view_inv_mast.item_id AS [Item ID], 
p21_view_inv_mast.item_desc AS [Item Desc], 
p21_view_inv_loc.location_id AS [Location ID], 
invoice_data.[Total Shipped by Sales Loc], 
purchase_data.[PO Qty Ordered] 

FROM    
p21_view_supplier 
INNER JOIN p21_view_inventory_supplier ON p21_view_supplier.supplier_id = p21_view_inventory_supplier.supplier_id 
INNER JOIN p21_view_inv_mast ON p21_view_inventory_supplier.inv_mast_uid = p21_view_inv_mast.inv_mast_uid 
INNER JOIN p21_view_inv_loc ON p21_view_inv_mast.inv_mast_uid = p21_view_inv_loc.inv_mast_uid 
--Invoices 
LEFT JOIN (
    SELECT   
    p21_view_invoice_hdr.sales_location_id, 
    p21_view_invoice_line.item_id, 
    p21_view_invoice_line.supplier_id, 
    p21_view_invoice_line.inv_mast_uid, 
    SUM(p21_view_invoice_line.qty_shipped) AS [Total Shipped by Sales Loc] 

    FROM    
    p21_view_invoice_hdr 
    INNER JOIN p21_view_invoice_line ON p21_view_invoice_hdr.invoice_no = p21_view_invoice_line.invoice_no 

    WHERE   
    (p21_view_invoice_hdr.invoice_date >= CONVERT(DATETIME, '2016-01-01 00:00:00', 102)) 

    GROUP BY 
    p21_view_invoice_hdr.sales_location_id, 
    p21_view_invoice_line.item_id, 
    p21_view_invoice_line.supplier_id, 
    p21_view_invoice_line.inv_mast_uid 
    ) invoice_data ON p21_view_supplier.supplier_id = invoice_data.supplier_id 
     AND p21_view_inv_mast.inv_mast_uid = invoice_data.inv_mast_uid 
     AND p21_view_inv_loc.location_id = invoice_data.sales_location_id 
--Purchasing 
LEFT JOIN (
    SELECT   
    p21_view_po_hdr.supplier_id, 
    p21_view_po_hdr.location_id AS [PO Loc ID], 
    SUM(p21_view_po_line.qty_ordered) AS [PO Qty Ordered], 
    p21_view_po_line.item_id AS [Item ID], 
    p21_view_po_line.inv_mast_uid 

    FROM    
    p21_view_po_hdr 
    INNER JOIN p21_view_po_line ON p21_view_po_hdr.po_no = p21_view_po_line.po_no 

    WHERE   
    (p21_view_po_hdr.date_created >= CONVERT(DATETIME, '2016-01-01 00:00:00', 102)) 
    AND (p21_view_po_hdr.delete_flag IS NULL OR 
          p21_view_po_hdr.delete_flag = 'N') 
    AND (p21_view_po_line.delete_flag IS NULL OR 
          p21_view_po_line.delete_flag = 'N') 
    AND (p21_view_po_line.cancel_flag IS NULL OR 
          p21_view_po_line.cancel_flag = 'N') 
    AND (p21_view_po_hdr.cancel_flag IS NULL OR 
          p21_view_po_hdr.cancel_flag = 'N') 

    GROUP BY 
    p21_view_po_hdr.supplier_id, 
    p21_view_po_hdr.location_id, 
    p21_view_po_line.item_id, 
    p21_view_po_line.inv_mast_uid 
    ) purchase_data ON p21_view_supplier.supplier_id = purchase_data.supplier_id 
     AND p21_view_inv_mast.inv_mast_uid = purchase_data.inv_mast_uid 
     AND p21_view_inv_loc.location_id = purchase_data.[PO Loc ID] 

WHERE   
(p21_view_supplier.supplier_id = 8761) 
AND (p21_view_inv_mast.delete_flag = 'N') 
AND NOT (purchase_data.supplier_id is null and invoice_data.supplier_id is null)  
ORDER BY 
p21_view_inv_mast.item_id, 
p21_view_inv_loc.location_id 
Смежные вопросы