I have 2 tables, Assets
and Main
. I want to create a query that will total the transactions in Main
, grouped by each account in Assets
. But there’s a catch: sometimes the amt
needs to be summed as a positive and sometimes as a negative.
In Assets
, I have the columns Account
and Descript
. Account
holds “1001”, and others, as text; Descript
is just text.
Account Descript -------------------------- 1001 Cash 1101 Receivable
In Main
, I have Amt
, Ac1
, and Ac2
.
Amt
holds amounts that we need to sumAc1
andAc2
hold account numbers fromAssets
as text
In Main
, when an account is marked in Ac1
, the transaction is a positive for that account. When an account is marked in Ac2
, the transaction amount is a
negative for that account.
Say, for one record, in Main:
- You have -1000.00 in “Amt”, you have “1001” in “Ac1”, and “1101” in “Ac2”.
- You have 2000.00 in “Amt”, you have “1001” in “Ac1”, and “1101” in “Ac2”.
Data:
Amt Ac1 Ac2 ------------------- -1000 1001 1101 2000 1001 1101
so then the expected result needs to be:
Account Descrip TtlAmt ------------------------------- 1001 Cash 1000.00 1101 Receivable -1000.00
I have some code but I’m not sure if it’s helpful.
SELECT Asset.Account, Asset.Descrip AS Expr1, SUM(Main.Amt) AS SumOfAMT, SUM(Main.Amt) AS Expr2 FROM Asset LEFT JOIN Main ON (Asset.ACCOUNT = Main.AC2) OR (Asset.ACCOUNT = Main.AC1) GROUP BY Asset.Account, Asset.Descrip;
Just to be super clear, I also have tables called “Liability”, “Expense”, etc. But I felt that we can focus on just the one query here, as the rest should fall into place with some guidance.
I know this has nothing to do with problem at hand, but in Excel I use the following formula to accomplish this.
SUM(SUMIF([sum range], [criteria range], [criteria]), SUMIF([sum range], [criteria range], [criteria])*-1)
I thought it may be helpful to explain my end goal.
Advertisement
Answer
Assuming there is a unique identifier field in Main.
Consider:
Query1
SELECT ID, "Ac1" AS Src, Ac1 AS Act, Amt FROM Main UNION SELECT ID, "Ac2", Ac2, Amt*-1 FROM Main;
Query2
SELECT Query1.Act, Assets.Descrip, Sum(Query1.Amt) AS SumOfAmt FROM Assets INNER JOIN Query1 ON Assets.Account = Query1.Act GROUP BY Query1.Act, Assets.Descrip;
All in one
SELECT Query1.Act, Assets.Descrip, Sum(Query1.Amt) AS SumOfAmt FROM Assets INNER JOIN (SELECT Ac1 AS Act, Amt FROM Main UNION SELECT Ac2, Amt*-1 FROM Main) AS Query1 ON Assets.Account = Query1.Act GROUP BY Query1.Act, Assets.Descrip;