SQL笔试题总结

本文通过一系列SQL题目,详细解析了如何使用row_number()over()、列转行方法以及Hive中的collect_set函数进行数据处理。还探讨了SQL效率优化,展示了如何查询特定条件下的数据。内容包括将学生分数表转换、找出订单交易最高金额记录、按月份累计交易金额,以及滴滴面试中涉及的SQL问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  

  

  

  

前言

  

本篇文章将总结博主在笔试或面试过程中碰到的比较有难度或经典的sql题目。笔试考察的大都不是很难,不像工作中那样好几个嵌套子查询,很多个表关联…可能行数很少,但绝对得多想。如果之前没碰见过,第一次做肯定会漏洞百出。会持续更新的~

  
  
  

一、列转行

  

题目:将表Student

name subject score
张三 语文 78.0
张三 数学 88.0
张三 英语 98.0
李四 语文 89.0
李四 数学 76.0
李四 英语 90.0
王五 语文 66.0

转化为下面的形式展示

name 语文 数学 英语 总分
张三 78 88 98 264
李四 89 76 90 255
王五 99 0 0 66

  

先放答案

SELECT `name`,语文,数学,英语,总分
FROM(
	SELECT
	`name`,
	SUM(IF(SUBJECT = '语文',score,0)) AS 语文,
	SUM(IF(SUBJECT = '数学',score,0)) AS 数学,
	SUM(IF(SUBJECT = '英语',score,0)) AS 英语
	FROM student
	GROUP BY `name`)t1
LEFT JOIN(
	SELECT `name`,SUM(score) AS 总分
	FROM student
	GROUP BY `name`)t2
USING(`name`);

  

逐步剖析

1、先看总分,计算很简单,就是按名字group by 之后 sum(分数) 即可

SELECT `name`,SUM(score) AS 总分
FROM student
GROUP BY `name`
name 总分
张三 264
李四 255
王五 66

得出这样的结果
  
2、本题精髓就是怎么把 subject 这一列数据转化成一行列名。可以拿 subject 列中的数据做 if 判断的条件,创建一张只有 name列 不变,后几列是 语数英 的新表

SELECT
`name`,
IF(SUBJECT = '语文',score,0) AS 语文,
IF(SUBJECT = '数学',score,0) AS 数学,
IF(SUBJECT = '英语',score,0) AS 英语
FROM student
name 语文 数学 英语
张三 78.0 0 0
张三 0 88.0 0
张三 0 0 98.0
李四 89.0 0 0
李四 0 76.0 0
李四 0 0 90.0
王五 66.0 0 0

  
3、离最终答案不远了,用 group by + sum 就能变成没人一行且语数英三列数据合并

SELECT
`name`,
SUM(IF(SUBJECT = '语文',score,0)) AS 语文,
SUM(IF(SUBJECT = '数学',score,<
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值