SQL如何快速分析出城市人口流动数量?(sum、分组、where)

【题目】

下面是统计每天各个城市之间的人口流入、流出的“各城市人口流动表”

需要通过以上数据,了解:

1:每个城市的总流入人口数量

2:统计2017年乘飞机在周末从北京流入的人口数

3:计算2018年流入流出长春的总人数

【问题1解题思路】:

计算每个城市的总流入人口数量

1、解题思路:此题分为2步,首先计算“总流入人口数量”,然后再分组到每个城市

2、题中提到“总流入人口数量” 需要用到聚集函数sum

3、“每个城市”的人口数量,需要按城市分组,用到分组函数group by,  


select 流入城市 as 城市,sum(数量) as 总人口流入数
from 各城市人口流动表
group by 流入城市;

【本题考点】

1、此题比较简单,考察聚合函数sum。常用的聚合函数还有count、max、min

2、考察分组group by子句的用法。需要注意的是group by子句列出的每一个字段都必须是select检索的列或者表达式,不能是聚集函数,也不能使用别名,group by分组后,如有条件筛选,使用Having语句过滤。

【问题2解题思路】:

统计2017年乘飞机在周末从北京流入的人口数

1、解题思路:此题分为2大步。第1步,先计算流入到北京的人口数,第2步,满足条件“2017年”、“乘飞机”、“周末”

2、计算"从北京流入的人口数",也就是“流出城市”为北京的人口数,需要用到汇总函数sum


select 流出城市,sum(数量) as 流出总人数
from 各城市人口流动表
where 流出城市="北京";

 2、题目要求满足多个并列条件:交通工具是"飞机",流入年份是"2017年”并且是“周末”。多个条件并列用"and"。


select 流出城市,sum(数量) as 流出总人数
from 各城市人口流动表
where 流出城市="北京"
and 交通工具="飞机"
and 年份="2017"
and 星期六或者星期日;

3、年份查询,题目给出的“日期”字段是具体的日期,要用具体的日

筛选出年份,用到年份的提取函数year()

4、星期查询,需要用date_format(date,format)函数在“日期”字段中筛选出周末。因周末有2天,周六、周日,用or操作符,把周六日全部选出来。

select 流出城市,sum(数量) as 流出总人数
from 各城市人口流动表
where 流出城市="北京"
and 交通工具=3
and year(日期)="2017"
and(date_format(日期,'%w')=6 or date_format(日期,'%w')=0)
group by 流出城市;

【本题考点】

1、多条件并列and操作符,返回满足所有给定条件的行。

2、date_format(date,format) 函数,SQL中设置时间格式函数,其中括号里的“date”是要设置的日期,“format” 是设置成规定日期/时间的格式。根据format字符串格式化date值。下列字符和字符串是常用的:

3、SQL常用的日期提取函数:

 

4、or操作符,筛选结果只要满足其中之一条件就被筛选出来,在与and连用时,优选计算and,and拥有较高的计算次序,or前后的条件一般需要用括号括起来,否则会优先计算and前后的条件,造成计算错误。

【问题3解题思路】:

计算2018年流入流出长春的总人数

1、解题思路:先把符合条件的"流入"的人数计算出来,并把符合条件的"流出"的人数计算出来,两者合并作为一个整体,然后对整体的结果再求和。

select sum(a)
from
(select sum(数量) as a
from 各城市人口流动表
where year(日期)="2018"
and 流出城市="长春"
union all
select sum(数量) as a
from  各城市人口流动表
where year(日期)="2018"
and 流入城市="长春"
)t;

 2、上一个解法思路比较清晰,但是写起来比较复杂,可以用“or”“and”连用简化一下,流入流出是一个条件,时间为一个条件,两者并列,简化为:


select sum(数量) as a
from 各城市人口流动表
where (流出城市="长春" or 流入城市="长春")
and year(日期)="2018";

【本题考点】

1、此题考察子查询,把子查询的结果作为一个临时表来查询,需要理清各层的逻辑关系,子查询都是从内到外逐层运行,内层没有错误后,再运行外层。

2、union的用法,union执行两条及以上select 语句,并把结果合成一个结果来查询,union中的每个查询都必须包含相同的列,union all查询所有的行,union查询不重复的行。

3、or、and连用,第2题考点总结4已有说明。

【经验分享】:

1、动手多写,多练、多运行语句。SQL书本的语句比较简单,看着都会,也不难,写都写的出来,可是一运行发现却是错的,写跟运行正确是两回事,只有实际运行才能找出错误,才能有收获,技术才能提高。

2、复杂的语句,先写里面的子句,再写外面的聚合。发现了错误,按照逻辑步骤,一步步运行,确保每一小步没有问题,最后才能运行正确。开始没有经验的时候,检查错误都是从上到下一句句的检查,这是不对的。另外,需要多点耐心,急不得,经验都是一点点积累了,不可能一口气吃个胖子。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值