我有一个巨大的表格,其中新行可能是前一行的“调整”。
表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以获取其余数据”。
答案 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
输出:
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';