我是靠谱客的博主 合适柚子,最近开发中收集的这篇文章主要介绍SQL 语句题 | 重新格式化部门表题目解析解法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • 题目
  • 解析
    • 第一步 列拆成行
      • CASE WHEN
      • IF
    • 第二步 行合并
  • 解法

题目

部门表 Department:

+---------------+---------+
| Column Name
| Type
|
+---------------+---------+
| id
| int
|
| revenue
| int
|
| month
| varchar |
+---------------+---------+

(id, month) 是表的联合主键。
这个表格有关于每个部门每月收入的信息。
月份(month)可以取下列值

["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]。

编写一个 SQL 查询来重新格式化表,使得新的表中有一个部门 id 列和一些对应 每个月 的收入(revenue)列。

查询结果格式如下面的示例所示:

Department 表:
+------+---------+-------+
| id
| revenue | month |
+------+---------+-------+
| 1
| 8000
| Jan
|
| 2
| 9000
| Jan
|
| 3
| 10000
| Feb
|
| 1
| 7000
| Feb
|
| 1
| 6000
| Mar
|
+------+---------+-------+

查询得到的结果表:

+------+-------------+-------------+-------------+-----+-------------+
| id
| Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue |
+------+-------------+-------------+-------------+-----+-------------+
| 1
| 8000
| 7000
| 6000
| ... | null
|
| 2
| 9000
| null
| null
| ... | null
|
| 3
| null
| 10000
| null
| ... | null
|
+------+-------------+-------------+-------------+-----+-------------+

注意,结果表有 13 列 (1个部门 id 列 + 12个月份的收入列)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reformat-department-table

解析

第一步 列拆成行

首先,根据题意,需要将revenue根据month拆成,结果如下表,有两种方式,CASE WHEN或者IF语句。

+------+-------------+-------------+-------------+-----+-------------+
| id
| Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue |
+------+-------------+-------------+-------------+-----+-------------+
| 1
| null
| 7000
| null
| ... | null
|
| 3
| null
| 10000
| null
| ... | null
|
| 1
| 8000
| null
| null
| ... | null
|
| 2
| 9000
| null
| null
| ... | null
|
| 1
| null
| null
| 6000
| ... | null
|
+------+-------------+-------------+-------------+-----+-------------+

CASE WHEN

SELECT id,
CASE `month` WHEN 'Jan' THEN revenue END Jan_Revenue,
CASE `month` WHEN 'Feb' THEN revenue END Feb_Revenue,
CASE `month` WHEN 'Mar' THEN revenue END Mar_Revenue,
CASE `month` WHEN 'Apr' THEN revenue END Apr_Revenue,
CASE `month` WHEN 'May' THEN revenue END May_Revenue,
CASE `month` WHEN 'Jun' THEN revenue END Jun_Revenue,
CASE `month` WHEN 'Jul' THEN revenue END Jul_Revenue,
CASE `month` WHEN 'Aug' THEN revenue END Aug_Revenue,
CASE `month` WHEN 'Sep' THEN revenue END Sep_Revenue,
CASE `month` WHEN 'Oct' THEN revenue END Oct_Revenue,
CASE `month` WHEN 'Nov' THEN revenue END Nov_Revenue,
CASE `month` WHEN 'Dec' THEN revenue END Dec_Revenue
FROM Department;

IF

SELECT id,
IF(`month`='Jan',revenue,NULL) Jan_Revenue,
IF(`month`='Feb',revenue,NULL) Feb_Revenue,
IF(`month`='Mar',revenue,NULL) Mar_Revenue,
IF(`month`='Apr',revenue,NULL) Apr_Revenue,
IF(`month`='May',revenue,NULL) May_Revenue,
IF(`month`='Jun',revenue,NULL) Jun_Revenue,
IF(`month`='Jul',revenue,NULL) Jul_Revenue,
IF(`month`='Aug',revenue,NULL) Aug_Revenue,
IF(`month`='Sep',revenue,NULL) Sep_Revenue,
IF(`month`='Oct',revenue,NULL) Oct_Revenue,
IF(`month`='Nov',revenue,NULL) Nov_Revenue,
IF(`month`='Dec',revenue,NULL) Dec_Revenue
FROM Department;

第二步 行合并

其次,根据题意,需要根据id,将相同id的行进行合并,结果如下表,采用分组的方式,可以对各月收入列求和(SUM)也可以求最大值(MAX)。

+------+-------------+-------------+-------------+-----+-------------+
| id
| Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue |
+------+-------------+-------------+-------------+-----+-------------+
| 1
| 8000
| 7000
| 6000
| ... | null
|
| 2
| 9000
| null
| null
| ... | null
|
| 3
| null
| 10000
| null
| ... | null
|
+------+-------------+-------------+-------------+-----+-------------+

解法

SELECT id,
SUM(CASE `month` WHEN 'Jan' THEN revenue END) Jan_Revenue,
SUM(CASE `month` WHEN 'Feb' THEN revenue END) Feb_Revenue,
SUM(CASE `month` WHEN 'Mar' THEN revenue END) Mar_Revenue,
SUM(CASE `month` WHEN 'Apr' THEN revenue END) Apr_Revenue,
SUM(CASE `month` WHEN 'May' THEN revenue END) May_Revenue,
SUM(CASE `month` WHEN 'Jun' THEN revenue END) Jun_Revenue,
SUM(CASE `month` WHEN 'Jul' THEN revenue END) Jul_Revenue,
SUM(CASE `month` WHEN 'Aug' THEN revenue END) Aug_Revenue,
SUM(CASE `month` WHEN 'Sep' THEN revenue END) Sep_Revenue,
SUM(CASE `month` WHEN 'Oct' THEN revenue END) Oct_Revenue,
SUM(CASE `month` WHEN 'Nov' THEN revenue END) Nov_Revenue,
SUM(CASE `month` WHEN 'Dec' THEN revenue END) Dec_Revenue
FROM Department
GROUP BY id;

最后

以上就是合适柚子为你收集整理的SQL 语句题 | 重新格式化部门表题目解析解法的全部内容,希望文章能够帮你解决SQL 语句题 | 重新格式化部门表题目解析解法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部