syntax for sql - easy ?

Posted on 2014-10-07
Last Modified: 2014-10-07
I have two tables with payments and deductions. How do I substract the payments from the deductions being in two separate tables ?

I need to take this total:
SELECT SUM (PmtRecd) as totalpayments
FROM dbo.BillPaymentsRecvdTA

and substract this total:
SELECT SUM (amount) AS totaltransactions
FROM    dbo.TATransactions

And call it "TotalAvailable"
Question by:amucinobluedot
LVL 25

Accepted Solution

Tomas Helgi Johannsson earned 500 total points
ID: 40367191

You do it like this

select X.totalpayments - y.totaltransactions as TotalAvailable
from (
SELECT SUM (PmtRecd) as totalpayments
FROM dbo.BillPaymentsRecvdTA ) as X,
SELECT SUM (amount) AS totaltransactions
FROM    dbo.TATransactions) as Y

Open in new window

     Tomas Helgi
LVL 58

Expert Comment

ID: 40367194
SELECT SUM (PmtRecd) as totalpayments,SUM (amount) AS totaltransactions,sum(PmtRecd)-sum(amount) as TotalAvailable
FROM dbo.BillPaymentsRecvdTA, dbo.TATransactions

Open in new window


Author Comment

ID: 40367202
The second option did not do the math correctly for some reason
LVL 48

Expert Comment

ID: 40367279
The second option produces a Cartesian product (or "cross join")  between the 2 tables. e.g. if there was 10 rows in the first table and 10 rows in the second table there would be 100 rows in total so any SUM() of the expanded set of rows will be wrong.

The reason this is not a problem in the first solution (by Thomas) is that each subquery produces just one row and 1*1 remains 1, so the unstated cross join of that query does not impact the arithmetic.

I really don't understand why points were awarded to an incorrect answer (sorry Gary)

To AVOID making accidental Cartesian products is SQL queries:
          Do NOT use commas in the FROM clause

Using ANSI 92 syntax instead of commas to list out tables stops accidental Cartesian products because you actually have to ask for it by using CROSS JOIN
      X.totalpayments - y.totaltransactions AS TotalAvailable
                 SUM(PmtRecd) AS totalpayments
           FROM dbo.BillPaymentsRecvdTA
     ) AS X
CROSS JOIN (              --<< here a cross join is OK because 1 * 1 = 1
                 SUM(amount) AS totaltransactions
           FROM dbo.TATransactions
     ) AS Y

Open in new window

and the second:
      SUM(PmtRecd)               AS totalpayments
    , SUM(amount)                AS totaltransactions
    , SUM(PmtRecd) - SUM(amount) AS TotalAvailable
FROM dbo.BillPaymentsRecvdTA
CROSS JOIN dbo.TATransactions --<< why CROSS JOIN here? this would be wrong!!!

Open in new window


Featured Post

DevOps Toolchain Recommendations

Read this Gartner Research Note and discover how your IT organization can automate and optimize DevOps processes using a toolchain architecture.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Learn by example how to specify CSS selectors for Selenium WebDriver test automation software.
Why do we like using grid based layouts in website design? Let's look at the live examples of websites and compare them to grid based WordPress themes.
Viewers will get an overview of the benefits and risks of using Bitcoin to accept payments. What Bitcoin is: Legality: Risks: Benefits: Which businesses are best suited?: Other things you should know: How to get started:
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…

920 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

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now