Mysql 具有多列条件的SQL分组
我有一张像下面这样的桌子。GiverID和TakerID都是另一个表的外键,比如Person表。GiverID和TakerID在一行之内是不一样的Mysql 具有多列条件的SQL分组,mysql,sql,aggregate-functions,Mysql,Sql,Aggregate Functions,我有一张像下面这样的桌子。GiverID和TakerID都是另一个表的外键,比如Person表。GiverID和TakerID在一行之内是不一样的 ID GiverPersonID TakerPersonID Amount 1 1 3 100 2 2 1 200 3 2 3 400 4
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是什么?试试这个-
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
输出:
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;
您的问题太不清楚了,想要的结果是否真的与样本表数据匹配?描述如何计算每个合计金额值。
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;