力扣sql刷题系列(三)

本文是力扣SQL刷题系列的第三部分,涉及了如何进行数据透视操作,展示学生地理信息报告,以及一系列的产品销售分析问题。通过解决618. 学生地理信息报告、619. 只出现一次的最大数字等题目,讲解了SQL中的子查询、排序、分组等技巧,旨在提升SQL查询和数据分析能力。

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

618. 学生地理信息报告
Create table If Not Exists Student (name varchar(50), continent varchar(7))
Truncate table Student
insert into Student (name, continent) values ('Jane', 'America')
insert into Student (name, continent) values ('Pascal', 'Europe')
insert into Student (name, continent) values ('Xi', 'Asia')
insert into Student (name, continent) values ('Jack', 'America')

表: student

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| name        | varchar |
| continent   | varchar |
+-------------+---------+
该表没有主键。它可能包含重复的行。
该表的每一行表示学生的名字和他们来自的大陆。

一所学校有来自亚洲、欧洲和美洲的学生。

写一个查询语句实现对大洲(continent)列的 透视表 操作,使得每个学生按照姓名的字母顺序依次排列在对应的大洲下面。输出的标题应依次为美洲(America)、亚洲(Asia)和欧洲(Europe)。

测试用例的生成使得来自美国的学生人数不少于亚洲或欧洲的学生人数。

查询结果格式如下所示。

示例 1:

输入: 
Student table:
+--------+-----------+
| name   | continent |
+--------+-----------+
| Jane   | America   |
| Pascal | Europe    |
| Xi     | Asia      |
| Jack   | America   |
+--------+-----------+
输出: 
+---------+------+--------+
| America | Asia | Europe |
+---------+------+--------+
| Jack    | Xi   | Pascal |
| Jane    | null | null   |
+---------+------+--------+

题解一:直接使用子查询

注意on后面要以第一个非null 为主就是t3这边

select
  America,
  Asia,
  Europe
from
  (
    select
      name as America,
      row_number() over(
        order by
          name
      ) rk
    from
      student
    where
      continent = 'America'
  ) t1
  left join (
    select
      name as Asia,
      row_number() over(
        order by
          name
      ) rk
    from
      student
    where
      continent = 'Asia'
  ) t2 on t1.rk = t2.rk
  left join (
    select
      name as Europe,
      row_number() over(
        order by
          name
      ) rk
    from
      student
    where
      continent = 'Europe'
  ) t3 on t1.rk = t3.rk;

题解二 换了一个排序思路

select
	America, Asia, Europe
from (select @america:=0, @europe:=0, @asia:=0) as init, (
	select
		name as America,
		@america:= @america + 1 as america_id
	from student where continent 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值