2014-02-14 177 views
1

我有三個表,即class_record,class_violation,violation。SQL查詢總和條件

表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

+3

你是怎麼得到2600的? –

+0

「所以總收費金額將是第一筆金額加上第二筆金額,如果提交兩次」 - 第 – nextgtech

+0

號問題中提及第一筆金額加上第二筆金額是600筆2600 –

回答

2

我會處理這通過計數違反IDS每個什麼。您可以在使用子查詢變量做到這一點:

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 AmountFirstAmount。它使查詢更易於讀取和寫入。

+0

@RaphaëlAlthaus200 + 400是600怎麼來到2600? –

+0

非常感謝您的幫助! – user3233787

+0

@RaphaëlAlthaus。 。 。謝謝你指出。不知何故,當我看到結果時,我認爲「2400」和「2600」是相同的。很明顯,我錯過了違規行爲是獨立於第一欄而計算的。但現在全部修好了。 –