繁体   English   中英

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

[英]How to sum a column where another column is equal to other table

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

Assets ,我有AccountDescript列。 Account包含“ 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;

只是为了非常清楚,我也有称为“责任”,“费用”等的表。但是我觉得我们可以只关注一个查询,因为其他查询应该在适当的指导下就位。

我知道这与手头的问题无关,但是在Excel中,我使用以下公式来完成此任务。

SUM(SUMIF([sum range], [criteria range], [criteria]), SUMIF([sum range], [criteria range], [criteria])*-1)

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

假设Main中有一个唯一的标识符字段。

考虑:

查询1

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;

从性能的角度来看,关联子查询可能是一种更好的方法:

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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM