查询从多个表中获取信息

时间:2014-10-12 17:00:36

标签: sql database postgresql

我正在编写一堆查询,这些查询从多个表中获取信息或实际使用子查询来初始化它们。我现在遇到问题的查询实际上应该创建另一个不在任何一个表中的字段。我写的查询的确切定义如下......

  

列出该国家/地区的所有城市的国家/地区名称,人口和人口总和。在查询中添加第四个字段,用于计算每个国家/地区的城市人口百分比。 (为了这个例子的目的,假设为一个国家列出的所有城市的人口总和代表该国家的整个城市人口。)按照城市人口百分比的递增顺序排序该查询的结果。

我为此查询尝试的代码如下

SELECT name, population, SUM(population) FROM what.country JOIN what.city ON city.country_code = 
country.country_code GROUP BY population ASC

我正在使用的表是

               Table "what.country"
     Column      |         Type          |               Modifiers              
-----------------+-----------------------+--------------------------------------
 country_code    | character(3)          | not null default ''::bpchar
 name            | character varying(52) | not null default ''::character varying
 continent       | continent             | not null
 region          | character varying(26) | not null default ''::character varying
 surface_area    | real                  | not null default 0::real
 indep_year      | smallint              | 
 population      | integer               | not null default 0

               Table "what.city"
    Column    |         Type          |                     Modifiers                  
--------------+-----------------------+-----------------------------------------
 id           | integer               | not null default nextval('city_id_seq'::regclass)
 name         | character varying(35) | not null default ''::character varying
 country_code | character(3)          | not null default ''::bpchar
 district     | character varying(20) | not null default ''::character varying
 population   | integer               | not null default 0

1 个答案:

答案 0 :(得分:1)

你解决了大部分问题 - 唯一缺少的是你可以通过将城市人口(你已经计算过的)的总和除以总人口来实现城市人口的百分比:

SELECT   cnt.name AS country_name, 
         cnt.population AS total_population, 
         SUM(cty.population)/(cnt.population) * 100 AS urban_percentage
FROM     what.country cnt 
JOIN     what.city cty ON cty.country_code = cnt.country_code 
GROUP BY cnt.name 
ORDER BY 3 ASC