如何求和另一列等于其他表格的列

时间:2019-06-29 04:22:20

标签: sql ms-access

我有2个表,AssetsMain。我想创建一个查询,该查询将汇总Main中的交易,并按Assets中的每个帐户进行分组。但是有一个陷阱:有时amt需要被总结为肯定的,有时需要被总结为否定的。

Assets中,我有列AccountDescriptAccount以文字形式包含“ 1001”和其他文字; Descript只是文本。

Account    Descript
--------------------------
1001       Cash
1101       Receivable

Main中,我有AmtAc1Ac2

  • Amt拥有我们需要累加的金额
  • Ac1Ac2以文本形式保存Assets中的帐号

Main中,当在Ac1中标记了一个帐户时,该交易对该帐户来说是肯定的。当在Ac2中标记一个帐户时,交易金额为 该帐户是否定的。

说一遍,在Main中:

  1. “ Amt”中有-1000.00,“ Ac1”中有“ 1001”,“ Ac2”中有“ 1101”。
  2. “ Amt”中有2000.00,“ Ac1”中有“ 1001”,“ Ac2”中有“ 1101”。

数据:

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)

我认为解释最终目标可能会有所帮助。

2 个答案:

答案 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)

此外,它消除了整个结果集的聚合。