今天又随手刷了一道力扣题,还是数据库的。这次是 1179题:重写部门表格。又是一道看似简单的题,但不注意还是容易出错😂。

此题主要考察的知识点👉:CASE WHEN/IF 函数的用法以及SQL分组聚合的方法。

解题思路👇:
仔细看题目这里的要求

要求表格以 部门id和每个月的收入 这样的形式来显示,如上。
那么问题来了,第一个:如何统计有哪些部门id?
第二个:如何统计每个月该id部门的收入?

  • 首先第一个问题很好解决,想要统计表格有哪些部门id,很自然就会想到用GROUP BY方法;
  • 第二个问题,要想统计每个月该部门的收入:
    • 那么先要知道该月是几月;
    • 接着找到该月份对应的收入填入即可。

PS: 但是这里有个易错的地方要注意!!!因为根据部门id来统计对应月份收入的时候,实际上中间还有这样一步:SQL每次执行查询,除了统计该月份有的数据,还会统计其他月份,它们都是NULL。所以最后还需要一个聚合函数(SUM/MAX)来把每次查询的数据按分组id汇总,这才是我们最后要的每月收入!!!

可能说的有点绕,可以看下面掌柜手绘的这个步骤分解图😂(有点丑 不要介意):

PPS: 这里还要先了解一个SQL语句查询的执行步骤:

SELECT col_1, col_2, COUNT(*) as num                  #顺序5
FROM table_1 JOIN table_2 ON table_1.id = table_2.id  #顺序1
WHERE col_3 > 2.90                                    #顺序2
GROUP BY table_1.id                                   #顺序3
HAVING num > 2                                        #顺序4
ORDER BY num DESC                                     #顺序6
LIMIT 2                                               #顺序7

接着再看掌柜这个手绘分解步骤图:

下面👇提供两个参考解法:

  • 第一个用CASE WHEN函数和聚合函数
SELECT id,
    SUM(CASE WHEN `month` = 'Jan' THEN revenue END) Jan_Revenue,
    SUM(CASE WHEN `month` = 'Feb' THEN revenue END) Feb_Revenue,
    SUM(CASE WHEN `month` = 'Mar' THEN revenue END) Mar_Revenue,
    SUM(CASE WHEN `month` = 'Apr' THEN revenue END) Apr_Revenue,
    SUM(CASE WHEN `month` = 'May' THEN revenue END) May_Revenue,
    SUM(CASE WHEN `month` = 'Jun' THEN revenue END) Jun_Revenue,
    SUM(CASE WHEN `month` = 'Jul' THEN revenue END) Jul_Revenue,
    SUM(CASE WHEN `month` = 'Aug' THEN revenue END) Aug_Revenue,
    SUM(CASE WHEN `month` = 'Sep' THEN revenue END) Sep_Revenue,
    SUM(CASE WHEN `month` = 'Oct' THEN revenue END) Oct_Revenue,
    SUM(CASE WHEN `month` = 'Nov' THEN revenue END) Nov_Revenue,
    SUM(CASE WHEN `month` = 'Dec' THEN revenue END) Dec_Revenue
FROM Department GROUP BY id;

  • 第二种就是用IF函数和聚合函数
SELECT id,
    MAX(IF(`month`='Jan',revenue,NULL)) Jan_Revenue,
    MAX(IF(`month`='Feb',revenue,NULL)) Feb_Revenue,
    MAX(IF(`month`='Mar',revenue,NULL)) Mar_Revenue,
    MAX(IF(`month`='Apr',revenue,NULL)) Apr_Revenue,
    MAX(IF(`month`='May',revenue,NULL)) May_Revenue,
    MAX(IF(`month`='Jun',revenue,NULL)) Jun_Revenue,
    MAX(IF(`month`='Jul',revenue,NULL)) Jul_Revenue,
    MAX(IF(`month`='Aug',revenue,NULL)) Aug_Revenue,
    MAX(IF(`month`='Sep',revenue,NULL)) Sep_Revenue,
    MAX(IF(`month`='Oct',revenue,NULL)) Oct_Revenue,
    MAX(IF(`month`='Nov',revenue,NULL)) Nov_Revenue,
    MAX(IF(`month`='Dec',revenue,NULL)) Dec_Revenue
FROM Department GROUP BY id;


对比了一下,两种方法都差不多,所以选你喜欢的就好😁。

如果你还对 GROUP BY后为什么要加聚合函数有疑问,请移步这位博主的文章,解释的很详细了👉: 关于group by的用法 ,谢谢 。

参考资料:
关于group by的用法