【SQL每日一练】查询“OCCUPATIONS”中的“Occupation”列并按Doctor、Professor、Singer、Actor列输出

文章目录


题目

查询"OCCUPATIONS"中的"Occupation"列,使每个姓名按字母顺序排序,并显示在其相应的"职业》下方。输出列标题应分别为Doctor、Professor、Singer和Actor。

注意:当不再有与某个职业对应的名称时,打印NULL。
输入格式

职业表描述如下:

职业只包含以下值之一:博士、教授、歌手或演员。

样本输入

样本输出

复制代码
Jenny    Ashley     Meera  Jane
Samantha Christeen  Priya  Julia
NULL     Ketty      NULL   Maria

一、分析

以SqlServer为例:

1.输出列标题应分别为Doctor、Professor、Singer和Actor

可以使用Pivot把行转为列:Pivot (max(name) for Occupation in ([Doctor],[Professor],[Singer], [Actor])) as b

2、使每个姓名按字母顺序排序,通过窗口函数进行排序row_number() over(PARTITION by Occupation order by name)

二、题解

1.SqlServer

代码如下(示例):

c 复制代码
select Doctor,Professor,Singer, Actor from (select Occupation,Name, row_number() over(PARTITION by Occupation order by name)  rom
from OCCUPATIONS ) as a 
Pivot (max(name) for Occupation in ([Doctor],[Professor],[Singer], [Actor])) as b

2.MySQL

代码如下(示例):

c 复制代码
SELECT MAX(C1), MAX(C2), MAX(C3), MAX(C4) FROM
(SELECT
COUNT(*) Rank,
IF (STRCMP(T1.Occupation, 'Doctor') = 0, T1.Name, NULL) AS C1,
IF (STRCMP(T1.Occupation, 'Professor') = 0, T1.Name, NULL) AS C2,
IF (STRCMP(T1.Occupation, 'Singer') = 0, T1.Name, NULL) AS C3,
IF (STRCMP(T1.Occupation, 'Actor ') = 0, T1.Name, NULL) AS C4
FROM Occupations T1 LEFT JOIN Occupations T2 ON T1.Occupation = T2.Occupation AND STRCMP(T1.Name, T2.Name) >= 0 GROUP BY T1.Name, T1.Occupation ORDER BY Rank, T1.Name) AS MyOccupations GROUP BY Rank;

3.Oracle

代码如下(示例):

复制代码
WITH D AS (SELECT NAME, ROWNUM R FROM (SELECT NAME FROM OCCUPATIONS WHERE OCCUPATION='Doctor' ORDER BY 1)),
     P AS (SELECT NAME, ROWNUM R FROM (SELECT NAME FROM OCCUPATIONS WHERE OCCUPATION='Professor' ORDER BY 1)),
     S AS (SELECT NAME, ROWNUM R FROM (SELECT NAME FROM OCCUPATIONS WHERE OCCUPATION='Singer' ORDER BY 1)),
     A AS (SELECT NAME, ROWNUM R FROM (SELECT NAME FROM OCCUPATIONS WHERE OCCUPATION='Actor' ORDER BY 1))
SELECT D.NAME,P.NAME,S.NAME,A.NAME
FROM 
  A FULL OUTER JOIN D ON A.R=D.R  
    FULL OUTER JOIN S ON A.R=S.R
    FULL OUTER JOIN P ON A.R=P.R;

总结

题目有很多种解法,上面只是其中三种解法,各位博主有其他解法欢迎分享!!!

相关推荐
七度黑光1 小时前
用 openclaw 给故障复盘打分:质量审核自动化实践
运维·服务器·前端·数据库·自动化
华科易迅2 小时前
Spring 事务(注解)
java·数据库·spring
Java面试题总结2 小时前
MySQL篇 索引失效
数据库·mysql
last demo2 小时前
mysql
运维·数据库·mysql·oracle
kevin_cat4 小时前
oracle 扩展表空间
数据库·oracle
花间相见5 小时前
【MySQL面试题】—— MySQL面试高频问题汇总:从原理到实战,覆盖90%考点
数据库·mysql·面试
高梦轩5 小时前
MySQL 数据库备份与恢复
数据库·oracle
一直都在5725 小时前
Redis(二)
数据库·redis·缓存
TDengine (老段)5 小时前
TDengine IDMP 工业数据建模 —— 属性
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据
爱丽_6 小时前
Redis 分布式锁:SET NX、过期时间、续租、可重入、Redlock 与坑
数据库·redis·分布式