LeetCode 1179:重新格式化部门表 (MySQL)

Emm*_*mma 0 mysql sql

这是一道LeetCode 面试题

编写此 MySQL 查询的最有效方法(时间/空间复杂度)是什么?编码风格是否遵循 MySQL 变量命名约定?

问题

表:部门

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| revenue       | int     |
| month         | varchar |
+---------------+---------+
Run Code Online (Sandbox Code Playgroud)

(id,month) 是该表的主键。

该表包含有关每个部门每月收入的信息。

月份的值包括 ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov", “十二月”]。

编写一个 SQL 查询来重新格式化该表,以便每个月都有一个部门 ID 列和一个收入列。

查询结果格式如下例:

部门表:

+------+---------+-------+
| id   | revenue | month |
+------+---------+-------+
| 1    | 8000    | Jan   |
| 2    | 9000    | Jan   |
| 3    | 10000   | Feb   |
| 1    | 7000    | Feb   |
| 1    | 6000    | Mar   |
+------+---------+-------+
Run Code Online (Sandbox Code Playgroud)

结果表:

+------+-------------+-------------+-------------+-----+-------------+
| id   | Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue |
+------+-------------+-------------+-------------+-----+-------------+
| 1    | 8000        | 7000        | 6000        | ... | null        |
| 2    | 9000        | null        | null        | ... | null        |
| 3    | null        | 10000       | null        | ... | null        |
+------+-------------+-------------+-------------+-----+-------------+
Run Code Online (Sandbox Code Playgroud)

请注意,结果表有 13 列(1 列代表部门 ID + 12 列代表月份)。

Create table If Not Exists Department (id int, revenue int, month varchar(5))
Truncate table Department
insert into Department (id, revenue, month) values ('1', '8000', 'Jan')
insert into Department (id, revenue, month) values ('2', '9000', 'Jan')
insert into Department (id, revenue, month) values ('3', '10000', 'Feb')
insert into Department (id, revenue, month) values ('1', '7000', 'Feb')
insert into Department (id, revenue, month) values ('1', '6000', 'Mar')
Run Code Online (Sandbox Code Playgroud)

试图

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
ORDER BY id;
Run Code Online (Sandbox Code Playgroud)

参考

1179. 重新格式化部门表

Tim*_*sen 5

我可能会使用MAX聚合函数,而不是SUM,假设给定的id月份只有一个收入记录。话虽这么说,如果您想使用SUM,那么您的CASE表达式应该有一个收入为零的 else 条件:

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

  • @Gordon也许我误读了这个问题,但我将显示的结果解释为OP已经拥有的结果,不一定是Leet期望的“正确”答案。 (2认同)