簡體   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