Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 181
  • Last Modified:

Need assistance with SQL Query

I am using the following query to return some information for a report:

SELECT tblInvoice.ID, tblInvoice.LegacyInvoiceNumber, tblInvoice.DateSubmitted, tblPaymentTerms.Terms, tblInvoiceStatus.Status, tblCompany.Name AS Company, tblEmployee.UserID AS Employee FROM tblCompany INNER JOIN tblInvoice ON tblCompany.ID = tblInvoice.fkCompany INNER JOIN tblPaymentTerms ON tblInvoice.fkPaymentTerms = tblPaymentTerms.ID INNER JOIN tblInvoiceStatus ON tblInvoice.fkInvoiceStatus = tblInvoiceStatus.ID INNER JOIN tblEmployee ON tblInvoice.fkEmployee = tblEmployee.ID WHERE tblInvoice.fkPaymentTerms IN (1, 2, 3, 4) AND tblInvoice.fkInvoiceStatus IN (1, 2, 3, 4, 5, 6, 7) ORDER BY ID DESC

It works as expected.  Now I need to add an additional calculated field to be returned with the query.  That is the "balance due" on each of the invoices (rows) of the preceding query.  This calculation is done in the program that we use with a bunch of functions, but I need to be able to return the value as part of the above query.  Right now here are the queries that are called by the functions to produce the desired result.  The issue that I can't seem to get my brain around is how to correctly calculate the sales tax based on taxable and non-taxable items in "tblInvoice_detail".

' TOTAL PAYMENTS ON THIS INVOICE
SELECT SUM(Amount) AS Total FROM tblInvoicePayment WHERE (fkInvoice = {0})

' SUM OF ALL DETAIL ROWS ON THIS INVOICE
SELECT SUM(Quantity * UnitPrice) AS SubTotal FROM tblInvoiceDetail WHERE (fkInvoice = {0})

' IF THE INVOICE IS NOT TAX EXEMPT THEN CALCULATE SALES TAX ON TAXABLE ITEMS
SELECT SUM(tblInvoiceDetail.Quantity * tblInvoiceDetail.UnitPrice * tblInvoice.SalesTaxRate) AS SubTotal FROM tblInvoiceDetail INNER JOIN tblInvoice ON tblInvoiceDetail.fkInvoice = tblInvoice.ID WHERE (tblInvoice.ID = {0}) AND (tblInvoiceDetail.Taxable = 1)

Is there a way to roll all this up into one query so that I would have a new calculated field "BalanceDue" returned along with the other information in the first query?  Thanks!
0
DanLockwood
Asked:
DanLockwood
  • 2
1 Solution
 
rgc6789Commented:
Forgive me for asking, but is there a TotalAmount in tblInvoice so that you don't have to recalculate the total each time?
0
 
DanLockwoodAuthor Commented:
No, the database doesn't store any calculated fields unfortunately.
0
 
Kevin CrossChief Technology OfficerCommented:
Something like this maybe:
SELECT tblInvoice.ID, tblInvoice.LegacyInvoiceNumber, tblInvoice.DateSubmitted
, tblPaymentTerms.Terms, tblInvoiceStatus.Status
, tblCompany.Name AS Company, tblEmployee.UserID AS Employee 
, COALESCE(details.SubTotal, 0) - COALESCE(payments.Total, 0) AS BalanceDue
FROM tblCompany 
INNER JOIN tblInvoice ON tblCompany.ID = tblInvoice.fkCompany 
INNER JOIN tblPaymentTerms ON tblInvoice.fkPaymentTerms = tblPaymentTerms.ID 
INNER JOIN tblInvoiceStatus ON tblInvoice.fkInvoiceStatus = tblInvoiceStatus.ID 
INNER JOIN tblEmployee ON tblInvoice.fkEmployee = tblEmployee.ID 
LEFT JOIN ( -- invoice payments
	SELECT fkInvoice, SUM(Amount) AS Total 
	FROM tblInvoicePayment
	GROUP BY fkInvoice
) payments ON payments.fkInvoice = tblInvoice.ID
LEFT JOIN ( -- detail lines
	SELECT d.fkInvoice
        -- if sales tax rate is a decimal, this should give you invoice + sales tax in one statement
        , SUM(d.Quantity * d.UnitPrice * (1 + CASE d.Taxable WHEN 1 THEN i.SalesTaxRate ELSE 0 END)) AS SubTotal 
	FROM tblInvoiceDetail d
	INNER JOIN tblInvoice i ON i.ID = d.fkInvoice
	GROUP BY d.fkInvoice
) details ON details.fkInvoice = tblInvoice.ID
WHERE tblInvoice.fkPaymentTerms IN (1, 2, 3, 4) 
	AND tblInvoice.fkInvoiceStatus IN (1, 2, 3, 4, 5, 6, 7) 
ORDER BY ID DESC

Open in new window

0
 
DanLockwoodAuthor Commented:
Right on the money.  Thanks!
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now