具有多列条件的SQL分组

时间:2019-05-29 07:29:52

标签: mysql sql aggregate-functions

我有一个如下表。 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?

3 个答案:

答案 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;