2013-03-11 55 views
0

我在尋求幫助,因爲我不太瞭解SQL。如何連接兩個表並計算某些值的出現次數?

我需要連接兩個表,並從第二個表計出現一些值來實現類似的統計數據表的效果,這將有coluns:

結果表:

  • 國家VARCHAR(20),
  • 站點VARCHAR(20),
  • suspected_violation長,
  • confirmed_violation長,
  • confirmed_no_violation長,
  • not_determined長,
  • 總長

我的結果表需要有前兩列(contry與本站)來自第一表「違規」和未來5列將包含數字(計數)在來自狀態表的每個可能的id值中的「Violations」中發生的status_id。

現在我可以上傳表格的圖片結果,我想達到的目標: Result Table

所以,我現有的兩個表:違規和狀態。

違規:

  • ID長,
  • 國家VARCHAR(20),
  • 網站VARCHAR(20),
  • STATUS_ID長,< - 這是在狀態的狀態標識表。
  • ...等欄目在這種情況下並不重要

狀態:

  • ID長,
  • 狀態長 列 「身份」 具有其分別對應的值(1-4) (1),確認違規(2),確認無違規(3),未確定(4)

在我加入的結果是t Ø有表應包含列:

  • 從違規表:「國家」和「網站」
  • 從狀態表:「涉嫌違反」,「確認衝突」,「確認不違規」,「不確定「,」總計「(這些列是違規表中出現的計數器)。

我的僞代碼和抽象的嘗試:

SELECT v.country, v.site, count(v.status_id == 1), count(v.status_id == 2), count(v.status_id == 3), count(v.status_id == 4) 
FROM Violations v JOIN Status s 
ON v.status_id=s.id 
GROUP BY v.country, v.site 

普萊斯幫我寫正確的SQL查詢,因爲有大的問題,要做到這一點。

+3

你已經嘗試過什麼? – 2013-03-11 16:45:12

+0

你提到的*圖片在哪裏? – 2013-03-11 16:49:46

+0

由於stacoverflow信譽限制,我無法添加圖片。我已經添加了我的僞代碼 – Roman 2013-03-11 16:56:59

回答

2

您應該能夠使用聚合函數與CASE表達式得到的結果:

select v.country, 
    v.site, 
    SUM(case when s.id = 1 then 1 else 0 end) Total_SuspectedViolations, 
    SUM(case when s.id = 2 then 1 else 0 end) Total_ConfirmedViolations, 
    SUM(case when s.id = 3 then 1 else 0 end) Total_ConfirmedNoViolations, 
    SUM(case when s.id = 4 then 1 else 0 end) Total_NotDetermined, 
    COUNT(*) Total 
from violations v 
inner join status s 
    on v.status_id = s.id 
group by v.country, v.site 

SQL Fiddle with Demo

這也沒有JOIN這樣寫:

select v.country, 
    v.site, 
    SUM(case when v.status_id = 1 then 1 else 0 end) Total_SuspectedViolations, 
    SUM(case when v.status_id = 2 then 1 else 0 end) Total_ConfirmedViolations, 
    SUM(case when v.status_id = 3 then 1 else 0 end) Total_ConfirmedNoViolations, 
    SUM(case when v.status_id = 4 then 1 else 0 end) Total_NotDetermined, 
    COUNT(*) Total 
from violations v 
group by v.country, v.site 

SQL Fiddle with Demo

+0

請問這是什麼'INNER JOIN'在這裏? – 2013-03-11 16:56:33

+0

@ PM77-1正如你會注意到我添加了第二個查詢,因爲不需要'INNER JOIN',除非你想在結果中使用任何'status'表格數據。在第一個查詢中,您可以在CASE表達式中使用's.id'而不是'v.status_id' – Taryn 2013-03-11 16:58:08

+0

謝謝,您的解決方案對我來說非常有用,對於我來說在SQL中並不先進! – Roman 2013-03-11 17:09:20

相關問題