我有三个表,即class_record,class_violation,violation。
表class_record包含以下列和数据:
Class Violation CR No. | Class ID
000-000 | A30-000
000-001 | A30-000
表class_violation包含以下列和数据:
Class Violation CR No. | Violation ID
000-000 | 2
000-000 | 1
000-001 | 2
000-001 | 4
000-001 | 3
表违规包含以下列和数据:
Violation ID | First Amount | Second Amount
1 | 1000 | 2000
2 | 200 | 400
3 | 500 | 1000
4 | 500 | 1000
表class_record
包含类记录的信息。
表class_violation
是包含已提交的违规内容的表。最后,表violation
包含有关违规的信息。
如果违规被提交两次,则会触发第二笔金额而不是第一笔金额。正如您在class_violation
列Violation ID
列上看到的那样,数字2违规ID被提交两次。第二笔金额必须是收费金额而不是第一笔金额。因此,如果提交两次,总收费金额将是第一笔金额加上第二笔金额。我的问题是,如何获得第二笔金额而不是第一笔金额,并获得违规的总金额?到目前为止,这是我的SQL查询,但是非常错误:
SELECT SUM(`First Amount`)
FROM violation
WHERE `Violation ID`
IN (SELECT `Violation ID` FROM class_violation
WHERE `Class Violation No.`
IN (SELECT `Class Violation CR No.`
FROM class_record WHERE `Class ID` = 'A30-000'))
请帮帮我。对不起我的英语不好。查询的结果必须是:
SUM
2600
这是我的sqlfiddle链接:http://sqlfiddle.com/#!2/2712a
答案 0 :(得分:2)
我会通过计算每种情况的违规ID来解决这个问题。您可以使用变量在子查询中执行此操作:
select sum(case when rn = 1 then v.`First Amount`
when rn = 2 then v.`Second Amount`
end)
from (select cv.*,
@rn := if(@vi = `Violation ID`, @rn + 1, 1) as rn,
@vi := `Violation ID`
from class_violation cv cross join
(select @rn := 0, @vi := '') const
order by `Violation ID`
) cv join
violation v
on cv.`Violation ID` = v.`Violation ID` join
class_record cr
on cv.`Class Violation CR No.` = cr.`Class Violation CR No.`
where cr.`Class ID` = 'A30-000';
我建议您重命名变量,这样就不需要反引号了。例如,将First Amount
命名为FirstAmount
。它使查询更容易阅读和写入。