Improve company productivity with a Business Account.Sign Up

x
?
Solved

Need assistance with SQL Query

Posted on 2009-07-07
4
Medium Priority
?
183 Views
Last Modified: 2012-05-07
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
Comment
Question by:DanLockwood
  • 2
4 Comments
 
LVL 5

Expert Comment

by:rgc6789
ID: 24795658
Forgive me for asking, but is there a TotalAmount in tblInvoice so that you don't have to recalculate the total each time?
0
 

Author Comment

by:DanLockwood
ID: 24795694
No, the database doesn't store any calculated fields unfortunately.
0
 
LVL 61

Accepted Solution

by:
Kevin Cross earned 2000 total points
ID: 24795793
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
 

Author Closing Comment

by:DanLockwood
ID: 31600669
Right on the money.  Thanks!
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

In this article we will get to know that how can we recover deleted data if it happens accidently. We really can recover deleted rows if we know the time when data is deleted by using the transaction log.
This article will show a step by step guide on how to mask column values in Oracle 12c using DBMS_REDACT full redaction option. This option is available on licensed Oracle Enterprise edition as part of Oracle's Advanced Security.
SQL Database Recovery Software repairs the MDF & NDF Files, corrupted due to hardware related issues or software related errors. Provides preview of recovered database objects and allows saving in either MSSQL, CSV, HTML or XLS format. Ensures recov…
Stellar Phoenix SQL Database Repair software easily fixes the suspect mode issue of SQL Server database. It is a simple process to bring the database from suspect mode to normal mode. Check out the video and fix the SQL database suspect mode problem.

585 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question