带有Sum的SQL查询条件

时间:2014-02-14 11:30:46

标签: 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

2 个答案:

答案 0 :(得分:1)

请参阅此查询:

SELECT class_record.ClassID,SUM(A.VioAmount),GROUP_CONCAT(A.VioAmount) FROM class_record INNER JOIN (SELECT class_record.ClassID, class_record.CR_No, IF(COUNT(violation.ViolationID)=1, SUM(FAmount),(FAmount+SAmount)) AS VioAmount FROM violation INNER JOIN class_violation ON violation.ViolationID = class_violation.ViolationID INNER JOIN class_record ON class_violation.CR_No = class_record.CR_No WHERE ClassID = 'A30-000' GROUP BY violation.ViolationID, class_record.ClassID) A ON A.ClassID = class_record.ClassID AND A.CR_No = class_record.CR_No GROUP BY class_record.ClassID

您也可以在http://sqlfiddle.com/#!2/0d855b/35

检查SQLFiddle

现在我将单独的Select中的值取出,然后将其与另一个取值以获取SUM。希望这能解决你的问题。一切都好。

答案 1 :(得分:0)

如果计数(违规ID)= 2则需要返回列“第二金额”,如果计数(违规ID)= 1,则需要“第一金额”?

如果我理解你的问题,请查找“CASE”操作符。