Leetcode題解之database(七)1179. Reformat Department Table

今天又隨手刷了一道力扣題,還是數據庫的。這次是 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的用法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章