Mysql 具有多列条件的SQL分组

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

我有一张像下面这样的桌子。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
该表的第一行表示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;