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 行转列函数)