2014-04-24 41 views
1

我有一堆數據存儲在數據庫中與縣人口統計有關。我需要能夠訪問某個縣的州內的平均數據。 例如,我需要能夠得到state_id與county_id爲1的縣的state_id相匹配的所有縣的平均值。基本上,如果某個縣在弗吉尼亞州,我需要所有縣的平均值弗吉尼亞州。我在設置這個查詢時遇到了麻煩,我希望你們可以給我一些幫助。這是我寫的內容,但它只返回數據庫中的一行,因爲它將兩個表的county_id鏈接在一起。如何獲得具有一定關係的行的平均值

SELECT AVG(demographic_data.percent_white) as avg_percent_white 
FROM demographic_data,counties, states 
WHERE counties.county_id = demographic_data.county_id AND counties.state_id = states.state_id 

這裏是我的基本的數據庫佈局:

counties 
------------------------ 
county_id | county_name 

states 
--------------------- 
state_id | state_name 

demographic_data 
----------------------------------------- 
percent_white | percent_black | county_id 

回答

1

您的查詢返回一行,因爲有一個聚集並沒有GROUP BY。如果你想要一個州內所有縣的平均數,我們只希望只有一行。

爲了得到一個「全州」平均來說,一個國家內的所有縣,這裏是做到這一點的一種方法:

SELECT AVG(d.percent_white) AS avg_percent_white 
    FROM demographic_data d 
    JOIN counties a 
    ON a.county_id = d.county_id 
    JOIN counties o 
    ON o.state_id = a.state_id 
WHERE o.county_id = 42 

注意,有沒有必要加入到state表。你只需要所有縣有相匹配的state_id。上面的查詢使用了對縣表的兩個引用。別名爲「a」的引用是針對一個州內的所有縣,引用別名爲「o」的引用是爲了獲得特定縣的state_id。

如果你已經有STATE_ID,你就不需要第二個參考:

SELECT AVG(d.percent_white) AS avg_percent_white 
    FROM demographic_data d 
    JOIN counties a 
    ON a.county_id = d.county_id 
WHERE a.state_id = 11 

隨訪

Q如果我想在另一個錶帶上。 。我們將其稱爲demographic_data_2,它也通過縣代碼鏈接

A我假設demographic_data表每縣county_id有一行。如果第二個表格適用,則執行一個簡單的JOIN操作。

JOIN demographic_data_2 c 
    ON c.county_id = d.county_id 

與該表加入進來,你可以在SELECT列表(例如SUM,MIN,MAX,AVG)添加適當的聚合表達式。

故障點通常是「丟失」和「重複」的數據......當第二個表中的每個縣的行都沒有一行時,或者對於某個特定的縣ID有多個行時,會導致行不包括在總計中,或者在總計中重複計算。


我們注意到原始查詢中返回的聚合是「平均數」。這是每個縣的平均值。

考慮:

bucket count_red count_blue count_total percent_red 
------ --------- ---------- ----------- ----------- 
    1  480   4   1000   48 
    2   60   1   200   30 

注意,有一個「的平均值平均值」之間的差異,以及使用總量的平均值。

SELECT AVG(percent_red) AS avg_percent_red 
    , SUM(count_red)/SUM(count_total) AS tot_percent_red 

avg_percent_red tot_percent_red 
--------------- --------------- 
      39    45 

這兩個值都是有效的,我們只是不想誤解或歪曲值。

+0

好..我有一個最後一個問題..如果我想引入另一張桌子怎麼辦?我們稱之爲demographic_data_2,它也通過county_id鏈接 – user3566753