首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LeetCode 1179:重新格式化部门表(MySQL)

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

Stack Overflow用户
提问于 2020-06-28 04:33:32
回答 1查看 3.2K关注 0票数 0

这是一个面试的LeetCode问题

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

问题

表:部门

代码语言:javascript
复制
+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| revenue       | int     |
| month         | varchar |
+---------------+---------+

(id,月份)是此表的主键。

该表提供了每个部门每月收入的信息。

月份的数值为“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”。

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

查询结果格式如下所示:

部门表:

代码语言:javascript
复制
+------+---------+-------+
| id   | revenue | month |
+------+---------+-------+
| 1    | 8000    | Jan   |
| 2    | 9000    | Jan   |
| 3    | 10000   | Feb   |
| 1    | 7000    | Feb   |
| 1    | 6000    | Mar   |
+------+---------+-------+

成果表:

代码语言:javascript
复制
+------+-------------+-------------+-------------+-----+-------------+
| id   | Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue |
+------+-------------+-------------+-------------+-----+-------------+
| 1    | 8000        | 7000        | 6000        | ... | null        |
| 2    | 9000        | null        | null        | ... | null        |
| 3    | null        | 10000       | null        | ... | null        |
+------+-------------+-------------+-------------+-----+-------------+

注意,结果表有13列(部门id为1,月份为12 )。

代码语言:javascript
复制
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')

尝试

代码语言:javascript
复制
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;

参考文献

1179.重新格式化部门表

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-28 04:44:07

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

代码语言:javascript
复制
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;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62618256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档