LeetCode(数据库)- 重新格式化部门表(补充版)

Posted 程序员牧码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode(数据库)- 重新格式化部门表(补充版)相关的知识,希望对你有一定的参考价值。

题目链接:点击打开链接

题目大意:略。

解题思路

GROUP BY id 会使department表按照id分组,生成一张虚拟表(假想中的表)如下

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

在虚拟表中,所有id=1的revenue或者month数据都写在了同一个单元格中,如8000、7000、6000都是写在同一单元格内的。真正的表是不能这样写的,所以这种写法只存在于虚拟表中,帮助我们理解。

当一个单元格中有多个数据时,case when只会提取当中的第一个数据。

以CASE WHEN month='Feb' THEN revenue END 为例,当id=1时,它只会提取month对应单元格里的第一个数据,即Jan,它不等于Feb,所以找不到Feb对应的revenue,所以返回NULL。(可以试试把我上面答案里的sum()统统去掉,执行结果与预期不一样。错就错在当id=1时,Feb_Revenue和Mar_Revenue的值变成了NULL)

那该如何解决单元格内含多个数据的情况呢?答案就是使用聚合函数,聚合函数就用来输入多个数据,输出一个数据的。如SUM()或MAX(),而每个聚合函数的输入就是每一个多数据的单元格。

以SUM(CASE WHEN month='Feb' THEN revenue END) 为例,当id=1时,它提取的Jan、Feb、Mar,从中找到了符合条件的Feb,并最终返回对应的revenue的值,即7000。

“错就错在当id=1时,Feb_Revenue和Mar_Revenue的值变成了NULL)” 如何理解?

就以作者意思,可能是CASE WHEN month='Jan' THEN revenue END ,在做着的情况下,一个分组会产生三个值,一个是等于Jan的值,还有两个不等于Jan的值就是null,如果你没用是sum函数,就是一行需要返回三条数据,但实际可能返回其中一条,那一条不是你需要的。所以使用sum函数,求和,因为加一个null值等于没加,所以三个值变成一个值(还以为是有多条id为1,月份也为1月的,才用SUM加起来的。原来还有这层含义)

AC 代码

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

以上是关于LeetCode(数据库)- 重新格式化部门表(补充版)的主要内容,如果未能解决你的问题,请参考以下文章

⭐️ LeetCode解题系列 ⭐️ 1179. 重新格式化部门表(Oracle Pivot 行转列函数)

⭐️ LeetCode解题系列 ⭐️ 1179. 重新格式化部门表(Oracle Pivot 行转列函数)

LeetCode:Database 08.重新格式化部门表

LeetCode1179. 重新格式化部门表,使用group by与case聚合处理

文巾解题 1179. 重新格式化部门表

leetcode 0215