Skip to content

Latest commit

 

History

History
90 lines (69 loc) · 2.31 KB

File metadata and controls

90 lines (69 loc) · 2.31 KB

English Version

题目描述

表: 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   |
+---------+------+--------+

 

进阶:如果不能确定哪个大洲的学生数最多,你可以写出一个查询去生成上述学生报告吗?

解法

SQL

# Write your MySQL query statement below
with t as (
    select
        *,
        row_number() over(
            partition by continent
            order by
                name
        ) rn
    from
        Student
)
select
    max(if(continent = 'America', name, null)) America,
    max(if(continent = 'Asia', name, null)) Asia,
    max(if(continent = 'Europe', name, null)) Europe
from
    t
group by
    rn