2017-09-06 83 views
1

鑑於架構here我試圖理解和解決以下3 SQL查詢,我很困惑使用GROUP BY的列和HAVING子句城市化率≥50%的國家的名稱,城市化率,人均國內生產總值。請注意,城市化率是城市人口的百分比。不要 計算具有NULL值的城市人口。爲什麼在這些例子中

SELECT country.name, round(sum(city.population)/country.population, 3) AS urban, round(gdp/country.population, 3) AS gdppc 
FROM city 
INNER JOIN country ON code = country 
INNER JOIN economy ON code = economy.country 
WHERE city.population IS NOT NULL 
GROUP BY country.name, country.population, economy.gdp 
HAVING round(sum(city.population)/country.population, 3) >= 0.5 
ORDER BY urban DESC; 

在上面的查詢,爲什麼我需要包括在GROUP BYcountry.populationeconomy.gdp?如果我在GROUP BY中嘗試使用country.name,我收到一個錯誤,說我應該包含其他人。

2-顯示那些擁有超過5000萬人的所有歐洲國家的組織?

SELECT name 
FROM organization 
INNER JOIN (SELECT organization 
      FROM country 
      INNER JOIN encompasses 
      ON code = encompasses.country 
      INNER JOIN ismember 
      ON code = ismember.country 
      WHERE population > 50000000 AND continent = 'Europe' 
      GROUP BY organization 
      HAVING count(ismember.country) = (SELECT count(*) 
               FROM country 
               INNER JOIN encompasses 
               ON code = country 
               WHERE population > 50000000 AND continent = 'Europe')) 
      AS innerQuery 
      ON abbreviation = innerQuery.organization; 

爲什麼我需要上面的HAVING部分?

3-插入一個名爲「Tivoli」的新組織和一個觸發器,說明德國是否加入「Tivoli」,英國和法國也是這樣。將德國插入「Tivoli」組織。確認正確的行爲。

我試過下面的腳本,但它不起作用,有什麼建議嗎?

do $$ 
begin 
IF(NOT EXISTS (SELECT 1 FROM organization WHERE organization."name" = 'Tivoli' AND organization.country = 'D')) 
BEGIN 
    INSERT INTO organization VALUES ('Tivoli','Tivoli organization',NULL,'F',NULL,NULL); 
     INSERT INTO organization VALUES ('Tivoli','Tivoli organization',NULL,'GB',NULL,NULL); 

END; 
end $$ 

回答

0

1)

您使用country.population和economy.gdp的選擇,外部的聚合函數(COUNT(),AVG()和SUM()),和你有一個GROUP BY 。您選擇的所有內容必須位於GROUP BY中或聚合函數內部。

2)

因爲你被要求證明都+爲50Mil人的國家組織。通過HAVING,您可以檢查該組織是否擁有適量的國家/地區。

3)

組織「名」 =「蒂沃利」 它應該是: organization.name

0

首先,你應該限制一個問題,一個只,而不是3。但這裏有一些指針全部3:

在上面的查詢,爲什麼我需要包括在GROUP BYcountry.populationeconomy.gdp?如果我在GROUP BY中嘗試使用country.name,我收到一個錯誤,說我應該包含其他人。

這是一個要求。只有在country.name的情況下,只有另外兩個字段在功能上依賴於country.name才能工作(在Postgres 9.1+中)。但可能country.name不是country表的主鍵,因此理論上可能在該表中有兩個具有相同名稱但不同人口的記錄。

規則是as follows

GROUP BY存在時,它是無效的SELECT列表中的表達式來指未分組列除了聚集函數內,或者如果未分組列在功能上依賴於分組列,因爲否則會有多個可能的值返回未分組列。 如果分組列(或其子集)是包含未分組列的表的主鍵,則存在函數依賴關係。

這是從版本9.1開始實施的。

爲什麼我需要上面的HAVING部分?

因爲上的聚集體(count在這種情況下)的條件,只能分組之後進行,並且因此可以不where子句中表達。在這種情況下,having條款確保組織不僅存在於一些大歐盟成員國,而且全部大歐盟成員國。

我試過下面的腳本,但它不起作用,有什麼建議嗎?

沒有適當的數據庫模式,它是不可能爲你提供了正確的SQ,但是從ERD圖似乎organization表沒有一個country場。相反,ismember表將組織與國家連接起來。你只插入一個organization,但有幾個ismember記錄(涉及每個成員國之一)

這也較好的名字在你的insert聲明領域,所以很顯然,其值對應於哪個領域。

相關問題