Как суммировать столбец, где другой столбец равен другой таблице - PullRequest
1 голос
/ 29 июня 2019

У меня есть 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:

  1. У вас -1000,00 дюймаAmt ", у вас есть" 1001 "в" Ac1 "и" 1101 "в" Ac2 ".
  2. У вас 2000,00 в" Amt ", у вас есть" 1001 "в" Ac1 "и" 1101 "в "Ac2".

Данные:

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)

Я подумал, что может быть полезно объяснить мою конечную цель.

Ответы [ 2 ]

2 голосов
/ 29 июня 2019

Предполагается, что в Main есть поле уникального идентификатора.

Рассмотрим:

Запрос1

SELECT ID, "Ac1" AS Src, Ac1 AS Act, Amt FROM Main
UNION SELECT ID, "Ac2", Ac2, Amt*-1 FROM Main;

Запрос2

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;
0 голосов
/ 29 июня 2019

С точки зрения производительности лучше использовать коррелированные подзапросы:

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).

Кроме того, оно исключает агрегирование всего набора результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...