Search code examples
sqlms-access-2016

MS Access multiple joins with criteria


I'm generating an Inventory Query and the below code (mostly) works but it includes Invoices that have been voided, resulting in negative inventory.

Void Yes/No field = tblInvoices.Void

tblInvoiceDetails.InvoiceNum = tblInvoices.ID

I can't figure out how to ensure this does not include invoices that were voided. Thank you in advance for your help!

SELECT tblInventory.ID, Nz(sumTotalPaid,0)-Nz(sumCreditAmount,0) AS Quantity
FROM (tblInventory 
LEFT JOIN (
    SELECT ProductID, Sum(Quantity) AS sumTotalPaid
    FROM tblOrderDetails
    GROUP BY tblOrderDetails.ProductID
)  AS sum1 
   ON tblInventory.ID = sum1.ProductID) 
LEFT JOIN (
    SELECT ProductID, Sum(Quantity) AS sumCreditAmount
    FROM tblInvoiceDetails
    GROUP BY tblInvoiceDetails.ProductID
)  AS sum2 
    ON tblInventory.ID = sum2.ProductID;

Solution

  • Try it this way:

    SELECT tblInventory.ID, Nz(sumTotalPaid,0)-Nz(sumCreditAmount,0) AS Quantity
    FROM (tblInventory  
    JOIN (
        SELECT ProductID, Sum(Quantity) AS sumTotalPaid
        FROM tblOrderDetails
        GROUP BY tblOrderDetails.ProductID
    )  AS sum1 
       ON tblInventory.ID = sum1.ProductID) 
    JOIN (
        SELECT ProductID, Sum(Quantity) AS sumCreditAmount
        FROM tblInvoiceDetails
        WHERE tblInvoiceDetails.InvoiceNum IN 
            (SELECT tblInvoices.ID
            FROM tblInvoices
            WHERE tblInvoices.Void='Yes')
        GROUP BY tblInvoiceDetails.ProductID
    )  AS sum2 
        ON tblInventory.ID = sum2.ProductID
    

    1.- First you use just JOIN instead of LEFT JOIN, so you just get the rows that have values in both tables.

    2.- You get only the Products that have the tblInvoices.Void='Yes'