运用SQL语句 join多张表

题源来源与网络

你将斩获:

  • 练练手,找找感觉 & 需求理解力
  • 多表连接(事实表 + 维度表 + 维度表)
  • 多对一:主表为事实表,待连接的表为维度表,left join,inner join 都可以;
  • 锁定统计所需要的数据表和字段(绘制E-R图)【E-R图如何绘制,可以去百度 Workbeach 】

简单点一下:
1.遇到多表关联的情况时,梳理清楚表与表之间的关系(建议E-R图),你就完成了一半的工作量;
2.磨刀不误看柴工
3.一定要注意避免多对多的关系
4.在进行表连接的时候,一定具备空间建构能力(空间逻辑想象力)

开局一张图:
在这里插入图片描述
需求
分别提取司机数大于20,司机总在线时长大于2小时,订单量大于1,乘客数大于1的城市名称数据;

-- 典型的错误,标准的零分
select  d.城市名称
       ,count(distinct c.司机id) 司机数
       ,sum(b.在线时长) 
       ,count(a.订单id) 订单量
       ,count(a.乘客id) 乘客数
from 订单数据 a 
inner join 在线时长数据 b on a.司机id = b.司机id 
inner join 司机数据 c on a.司机id = c.司机id
inner join 城市匹配数据 d on c.城市id = d.城市id
group by d.城市名称;

-- 表之间的关联要尽量避免多对多,以上犯了经典的逻辑错误

① 司机数>20

-- ① 司机数>20
select a.城市id,城市名称,count(司机id) as num
from 司机数据 a left join 城市匹配数据 b on a.城市id = b.城市id
group by a.城市id,城市名称
having count(司机id)>20;

在这里插入图片描述

② 总在线时长数据 >2小时

-- ② 总在线时长数据 >2小时

select  a.司机id
       ,总在线时长
	   ,城市名称
from 
(select 司机id,sum(在线时长) as 总在线时长
from 在线时长数据 
group by 司机id
having sum(在线时长)>2)a
left join 司机数据 b on a.司机id = b.司机id
left join 城市匹配数据 c on c.城市id = b.城市id;

在这里插入图片描述

③订单量大于1

-- ③订单量大于1
select  a.司机id,订单量,城市名称
from(select 司机id,count(订单id) as 订单量
	from 订单数据 
	group by 司机id
	having count(订单id)>1) a
left join 司机数据 b on a.司机id = b.司机id
left join 城市匹配数据 c on c.城市id = b.城市id; 

在这里插入图片描述
④乘客数大于1

-- ④乘客数大于1
select a.司机id,乘客数,城市名称
from 
(select 司机id,count(乘客id) as 乘客数
from 订单数据 group by 司机id having count(乘客id)>1)a
left join 司机数据 b on a.司机id = b.司机id
left join 城市匹配数据 c on c.城市id = b.城市id; 

多对一:主表为事实表,待连接的表为维度表,left join,inner join 都可以;

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值