我有一个如下表。 GiverID和TakerID都是另一个表的外键,例如人员表。 GiverID和TakerID在一行中不会相同。
ID GiverPersonID TakerPersonID Amount
1 1 3 100
2 2 1 200
3 2 3 400
4 3 2 800
该表的第一行表示ID为1的人给ID为3的人100。
我需要查询以获取如下结果
PersonID TotalAmount
1 100
2 200
3 -300
基本上,计算每个人的最终数量。 对于ID为1的人,他给ID为3的人100,但对ID为2的人取200,因此他的最终金额为200-100,即100。
我已经读过有关旋转的知识,但我认为旋转不是正确的步骤。
什么是计算结果的有效SQL?
答案 0 :(得分:2)
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
答案 1 :(得分:0)
试试这个-
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
答案 2 :(得分:0)
如果您想让所有人-而不只是桌子上的人-那么您可以尝试:
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;