У меня есть таблица, как показано ниже. GiverID и TakerID являются внешними ключами к другой таблице, скажем, таблице Person. GiverID и TakerID не будут совпадать в пределах строки.
ID GiverPersonID TakerPersonID Amount
1 1 3 100
2 2 1 200
3 2 3 400
4 3 2 800
Первая строка для этой таблицы означает, что человек с идентификатором 1 дает 100 человеку с идентификатором 3.
Мне нужен запрос, чтобы получить результат, как показано ниже
PersonID TotalAmount
1 100
2 200
3 -300
В основном, вычисляя окончательную сумму каждого человека. Для человека с ID 1 он дает 100 человеку с ID 3, но берет 200 у человека с ID 2, поэтому его окончательная сумма составляет 200 - 100, что равно 100.
Я читал о повороте, но я думаю, что поворот - не правильный шаг.
Каков эффективный SQL для вычисления этого результата?
Действительно ли желаемый результат соответствует данным выборочной таблицы? Опишите, как вы рассчитываете каждое значение TotalAmount.
Попробуй это-
SELECT
CASE
WHEN A.GiverPersonID IS NULL THEN B.TakerPersonId
ELSE A.GiverPersonID
END PersonID,
B.Take - A.Give TotalAmount
FROM
(
SELECT GiverPersonID, SUM(Amount) Give
FROM your_tabel A
GROUP BY GiverPersonID
)A
FULL JOIN
(
SELECT TakerPersonId, SUM(Amount) Take
FROM your_tabel A
GROUP BY TakerPersonId
) B
ON A.TakerPersonId= B.TakerPersonId
Выход-
PersonID TotalAmount
1 100
2 200
3 -300
select user_id, sum(amount) from
(
select TakerPersonID as user_id, sum(amount) as amount
from stack56355221
group by 1
union all
select GiverPersonID, sum(-amount)
from stack56355221
group by 1
) as t1
group by 1
Выход:
1 100
2 200
3 -300
Если вам нужно все людей, а не только тех, кто есть в таблице, вы можете попробовать:
select p.*,
(select sum(case when p.PersonId = t.GiverPersonID then t.amount else - t.amount end)
from t
where p.PersonId in (t.GiverPersonID, t.takerPersonID)
) as net_amount
from persons;
ваш вопрос слишком неясен