我有2个表,Assets
和Main
。我想创建一个查询,该查询将汇总Main
中的交易,并按Assets
中的每个帐户进行分组。但是有一个陷阱:有时amt
需要被总结为肯定的,有时需要被总结为否定的。
在Assets
中,我有列Account
和Descript
。 Account
以文字形式包含“ 1001”和其他文字; Descript
只是文本。
Account Descript
--------------------------
1001 Cash
1101 Receivable
在Main
中,我有Amt
,Ac1
和Ac2
。
Amt
拥有我们需要累加的金额Ac1
和Ac2
以文本形式保存Assets
中的帐号在Main
中,当在Ac1
中标记了一个帐户时,该交易对该帐户来说是肯定的。当在Ac2
中标记一个帐户时,交易金额为
该帐户是否定的。
说一遍,在Main中:
数据:
Amt Ac1 Ac2
-------------------
-1000 1001 1101
2000 1001 1101
所以预期结果必须是:
Account Descrip TtlAmt
-------------------------------
1001 Cash 1000.00
1101 Receivable -1000.00
我有一些代码,但是不确定是否有帮助。
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;
为清楚起见,我还具有称为“责任”,“费用”等的表。但是我觉得我们可以在这里只关注一个查询,因为其他查询应该在适当的指导下进行。 / p>
我知道这与手头的问题无关,但是在Excel中,我使用以下公式来完成此任务。
SUM(SUMIF([sum range], [criteria range], [criteria]), SUMIF([sum range], [criteria range], [criteria])*-1)
我认为解释最终目标可能会有所帮助。
答案 0 :(得分:2)
假设Main中有一个唯一的标识符字段。
考虑:
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;
合而为一
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;
答案 1 :(得分:0)
从性能的角度来看,关联子查询可能是一种更好的方法:
select a.*,
( (select nz(sum(m.amt), 0)
from main as m
where m.ac1 = a.account
) -
(select nz(sum(m.amt), 0)
from main as m
where m.ac2 = a.account
)
) as net_amount
from assets as a;
尤其是,这可以利用两个索引:main(ac1, amt)
和main(ac2.amt)
。
此外,它消除了整个结果集的聚合。