使用第二个表从表中求和日志值

时间:2014-03-30 14:25:35

标签: mysql sql

我有一个巨大的表格,其中新行可能是前一行的“调整”。

表A:

Id   | RefId |   TransId    |Score 
----------------------------------
101  |  null |    3001      |  10
102  |  null |    3002      |  15
103  |  null |    3003      |  15
104  |  101  |              |  -5
105  |  null |    3004      |   5
106  |  105  |              | -10 
107  |  null |    3005      |  15 

表B:

TransId | Person 
----------------
3001  |  Harry
3002  |  Draco
3003  |  Sarah 
3004  |  Ron 
3005  |  Harry 

在上表中,Harry在TableA.Id = 101中获得了10分,在TableA.Id = 104中扣除了其中5分,然后在TableA.Id = 107中再获得15分。

我想在这里做的是返回哈利是与得分相关联的人的所有行。问题是没有名称附加到扣除点的行,而只附加到给出分数的行(通过TableB)。但是,总是从先前给定的分数中扣除分数,其中原始交易的Id在表中被称为“RefId”。

SELECT 
SUM TableA.Score 
FROM TableA 
LEFT JOIN TableB ON TableA.Trans=TableB.TransId
WHERE 1
AND TableB.Person='Harry'
GROUP BY TableA.Score

这只给了我给Harry的分数,而不是扣除的分数。我希望得到总得分,哈利为20。 (10-5 + 15 = 20)

如何让MySQL包含负分数?我觉得应该可以使用TableA.RefId。像“如果有RefId,从这一行获得分数,但查看相应的TableA.Id以获取其余数据”。

3 个答案:

答案 0 :(得分:2)

Select sum(total) AS total
From tableb
Join
(
  Select t1.transid, sum(score) AS total
  From tablea t1
  Join tablea t2 on t1.id = t2.refid
  group by t1.transid
) x on x.transid = tableb.transid
Where TableB.Person='Harry'

答案 1 :(得分:0)

试试这个:

 select sum(sum1 + sums) as sum_all from (
      SELECT  t1.id,T1.Score sum1, coalesce(T2.score,0) sums
      FROM Table1 t1
      inner JOIN Table2 ON T1.TransId=Table2.TransId
      left JOIN Table1 t2 ON  t2.RefId = t1.id 
       WHERE  Table2.Person='Harry'
      )c

DEMO HERE

输出:

 SUM_ALL
 20

答案 2 :(得分:0)

如果您认为调整不会修改调整,则可以在不汇总所有数据的情况下执行此操作:

select sum(a.score + coalesce(aref.score, 0)) as HarryScore
from tableA a left outer join
     tableA aref
     on a.refId = aref.id left outer join
     tableB b
     on a.TransId = b.Transid left outer join
     tableB bref
     on aref.TransId = bref.TransId
where b.Person = 'Harry' or bref.Person = 'Harry';