除了COALESCE之外,SQL结果中排除的项目

时间:2015-11-19 22:52:30

标签: sql sql-server tsql

我试图从@StartDate中提取客户购买的所有商品ID。自部件售出以来,一些商品ID已被更改,因此我将COALESCE添加到SELECT语句中,希望它返回部件的新商品ID,但返回的唯一部件是具有备用代码的部件。从未改变且没有替代代码的物品ID不在结果中......我不确定原因。

SELECT DISTINCT p21_view_invoice_line.supplier_id 
                AS 
                [Supp ID], 
                address_1.NAME 
                AS Supplier, 
                address.NAME 
                AS Customer, 
                COALESCE(p21_view_alternate_code.item_id, 
                p21_view_invoice_line.item_id) AS 
                [Item ID], 
                p21_view_alternate_code.item_desc 
                AS [Item Desc], 
                p21_view_invoice_line.customer_part_number 
                AS CPN, 
                p21_view_invoice_line.unit_of_measure 
                AS UOM, 
                p21_view_invoice_hdr.order_no 
                AS [Order No], 
                p21_view_invoice_hdr.invoice_date 
                AS [Invoice Date], 
                p21_view_invoice_line.qty_shipped 
                AS [Qty Shipped], 
                p21_view_invoice_line.unit_price 
                AS [Last Invoiced Sales Price], 
                p21_view_invoice_line.commission_cost 
                AS [Last Invoice Comm Cost], 
                inv_loc.standard_cost 
                AS [Current Standard Cost] 
FROM   p21_view_invoice_hdr 
       INNER JOIN p21_view_invoice_line 
               ON p21_view_invoice_hdr.invoice_no = 
                  p21_view_invoice_line.invoice_no 
       INNER JOIN inv_loc 
               ON p21_view_invoice_line.company_id = inv_loc.company_id 
       INNER JOIN address AS address_1 
               ON p21_view_invoice_line.supplier_id = address_1.id 
       INNER JOIN address 
               ON p21_view_invoice_hdr.customer_id = address.id 
       INNER JOIN p21_view_alternate_code 
               ON inv_loc.inv_mast_uid = p21_view_alternate_code.inv_mast_uid 
                  AND p21_view_invoice_line.inv_mast_uid = 
                      p21_view_alternate_code.inv_mast_uid 
WHERE  ( p21_view_invoice_hdr.customer_id = @Customer_ID ) 
       AND ( p21_view_invoice_hdr.invoice_date >= @StartDate ) 
ORDER  BY [supp id], 
          [item id], 
          [invoice date] DESC, 
          [current standard cost] DESC 

2 个答案:

答案 0 :(得分:1)

强烈的预感:

LEFT OUTER JOIN p21_view_alternate_code
    ON  inv_loc.inv_mast_uid = p21_view_alternate_code.inv_mast_uid 
        AND p21_view_invoice_line.inv_mast_uid = p21_view_alternate_code.inv_mast_uid

答案 1 :(得分:0)

我重写了代码并为两个Item ID标识符列inv_mas_uid包含了一个FULL OUTER JOIN,这就解决了这个问题。查询大约需要2-3秒。

这是新查询。

SELECT DISTINCT 
p21_view_invoice_line.supplier_id AS [Supp ID]
, address_1.name AS Supplier
, p21_view_invoice_hdr.customer_id AS [Customer ID]
, address.name AS Customer
, COALESCE (p21_view_alternate_code.item_id, p21_view_invoice_line.item_id) AS [Item ID]
, COALESCE (p21_view_alternate_code.item_desc, p21_view_invoice_line.item_desc) AS [Item Desc]
--, p21_view_invoice_line.inv_mast_uid
, p21_view_invoice_line.customer_part_number AS CPN
, p21_view_invoice_hdr.order_no AS [Order No]
, p21_view_invoice_hdr.invoice_date AS [Invoice Date]
, p21_view_invoice_line.qty_shipped AS [Qty Shipped]
, p21_view_invoice_line.unit_of_measure AS UOM
, p21_view_invoice_line.commission_cost AS [Comm Cost]
, p21_view_invoice_line.unit_price AS [Unit Price]
, inv_loc.standard_cost AS [Current Std Cost]

FROM            
address 
INNER JOIN p21_view_alternate_code 
FULL OUTER JOIN p21_view_invoice_line ON p21_view_alternate_code.inv_mast_uid = p21_view_invoice_line.inv_mast_uid 
INNER JOIN p21_view_invoice_hdr ON p21_view_invoice_line.invoice_no = p21_view_invoice_hdr.invoice_no 
INNER JOIN inv_loc ON p21_view_invoice_line.inv_mast_uid = inv_loc.inv_mast_uid 
INNER JOIN address AS address_1 ON p21_view_invoice_line.supplier_id = address_1.id ON address.id = p21_view_invoice_hdr.customer_id

WHERE     
(p21_view_invoice_hdr.customer_id = @Customer_ID)    
AND (p21_view_invoice_hdr.invoice_date >= @Begin_Date) 
--AND (p21_view_invoice_line.supplier_id = 9219) 
AND (p21_view_invoice_line.supplier_id IS NOT NULL)

ORDER BY 
[Supplier]
, [Invoice Date] DESC
, [Item ID]