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!
DanLockwoodAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

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

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
DanLockwoodAuthor Commented:
Right on the money.  Thanks!
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Query Syntax

From novice to tech pro — start learning today.