2016-04-15 124 views
0

我有一个人口表,我想比较两年的人口。在两年的比较日期

我的表结构:
ID(自动递增),式(男人,女人,小孩),人口(1〜10000),日期

我想运行两个下查询并显示到一个表的结果:

QUERY1:

SELECT type,count(population) as count_of_year1 
FROM population 
where date between '2013-01-01' and '2013-01-24' 
GROUP BY type 

QUERY2:

SELECT type, count(population) as count_of_year2 
FROM population 
where date between '2014-01-01' and '2014-01-24' 
GROUP BY type 

我需要此结果:

|类型| 2013年人口| |人口在2014年

如何做到这一点?

回答

0

使用case表达式进行条件计数:

SELECT type, 
     count(case when date between '2013-01-01' and '2013-01-24' then population end) as count_of_year1, 
     count(case when date between '2014-01-01' and '2014-01-24' then population end) as count_of_year2 
FROM population 
GROUP BY type 

如果需要添加此where条款加快速度:

where date between '2013-01-01' and '2013-01-24' 
    or date between '2014-01-01' and '2014-01-24' 
+0

坦克你。我想添加栏以显示2013年的人口总和。这可能吗?如何在案例表达式中添加此条件 – vahid

+0

现在,当我再次阅读您的问题时,我不太确定我是否已经回答了问题...以后可能会返回调整后的查询!或者这是你要求的吗? – jarlh

0

由于人口可以有1的值到10000,我承担你想在这里SUM()不是COUNT()。

我有各类单独的表:

  • population_type - ID,标题
  • 人口 - ID,TYPE_ID(参考type.id),人口,日期

然后我更喜欢在这里使用JOIN:

SELECT pt.title type, 
      COALESCE(y1.total_population,0) population_2013, 
      COALESCE(y2.total_population,0) population_2014 
     FROM population_type pt 
LEFT JOIN (
     SELECT type_id, 
       SUM(population) total_population, 
      FROM population 
     WHERE date >= '2013-01-01' 
      AND date < '2013-01-24' + INTERVAL 1 DAY   
     GROUP BY type 
      ) y1 
     ON y1.type_id = pt.id   
LEFT JOIN (
     SELECT type_id, 
       SUM(population) total_population, 
      FROM population 
     WHERE date >= '2014-01-01' 
      AND date < '2014-01-24' + INTERVAL 1 DAY   
     GROUP BY type 
      ) y2 
     ON y2.type_id = pt.id 

这样你就只需要每次总结你所需要的东西并且查询更加模块化。