SQL查询求和条件

时间:2014-02-14 13:11:29

标签: mysql sql

我有三个表,即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_violationViolation 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

1 个答案:

答案 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。它使查询更容易阅读和写入。