LeetCode:1179.重新格式化部门表
题目链接:https://leetcode-cn.com/problems/reformat-department-table/
题目
部门表 Department
:
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| revenue | int |
| month | varchar |
+---------------+---------+
(id, month) 是表的联合主键。
这个表格有关于每个部门每月收入的信息。
月份(month)可以取下列值 ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]。
编写一个 SQL 查询来重新格式化表,使得新的表中有一个部门 id 列和一些对应 每个月 的收入(revenue)列。
查询结果格式如下面的示例所示:
Department 表:
+------+---------+-------+
| id | revenue | month |
+------+---------+-------+
| 1 | 8000 | Jan |
| 2 | 9000 | Jan |
| 3 | 10000 | Feb |
| 1 | 7000 | Feb |
| 1 | 6000 | Mar |
+------+---------+-------+
查询得到的结果表:
+------+-------------+-------------+-------------+-----+-------------+
| 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 列 (1个部门 id 列 + 12个月份的收入列)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reformat-department-table
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
第一感觉就是Python
或者R
中的长宽表转换。
R
中可以使用Reshape2
包中的dcast
函数进行处理。
SQL
中考虑用case when
进行行列转换。
本地oracle
环境进行测试。
-- 创建中间表
create table temp_cwh_department
(
id int,
revenue int,
month varchar2(10)
)
-- 插入测试数据
insert into temp_cwh_department values(1, 8000, 'Jan');
insert into temp_cwh_department values(2, 9000, 'Jan');
insert into temp_cwh_department values(3, 10000, 'Feb');
insert into temp_cwh_department values(1, 7000, 'Feb');
insert into temp_cwh_department values(1, 6000, 'Mar');
-- 查询
select * from temp_cwh_department
-- 测试
select id,
max(case when month = 'Jan' then revenue else null end) as Jan_Revenue,
max(case when month = 'Feb' then revenue else null end) as Feb_Revenue,
max(case when month = 'Mar' then revenue else null end) as Mar_Revenue,
max(case when month = 'Apr' then revenue else null end) as Apr_Revenue,
max(case when month = 'May' then revenue else null end) as May_Revenue,
max(case when month = 'Jun' then revenue else null end) as Jun_Revenue,
max(case when month = 'Jul' then revenue else null end) as Jul_Revenue,
max(case when month = 'Aug' then revenue else null end) as Aug_Revenue,
max(case when month = 'Sep' then revenue else null end) as Sep_Revenue,
max(case when month = 'Oct' then revenue else null end) as Oct_Revenue,
max(case when month = 'Nov' then revenue else null end) as Nov_Revenue,
max(case when month = 'Dec' then revenue else null end) as Dec_Revenue
from temp_cwh_department
group by id
LeetCode
提交
---- oracle ----
/* Write your PL/SQL query statement below */
select id,
max(case when month = 'Jan' then revenue else null end) as Jan_Revenue,
max(case when month = 'Feb' then revenue else null end) as Feb_Revenue,
max(case when month = 'Mar' then revenue else null end) as Mar_Revenue,
max(case when month = 'Apr' then revenue else null end) as Apr_Revenue,
max(case when month = 'May' then revenue else null end) as May_Revenue,
max(case when month = 'Jun' then revenue else null end) as Jun_Revenue,
max(case when month = 'Jul' then revenue else null end) as Jul_Revenue,
max(case when month = 'Aug' then revenue else null end) as Aug_Revenue,
max(case when month = 'Sep' then revenue else null end) as Sep_Revenue,
max(case when month = 'Oct' then revenue else null end) as Oct_Revenue,
max(case when month = 'Nov' then revenue else null end) as Nov_Revenue,
max(case when month = 'Dec' then revenue else null end) as Dec_Revenue
from Department
group by id ---- 887ms
看看解答、评论,再学习一番。
改用sum
,速度快一点。
---- oracle ----
---- oracle ----
/* Write your PL/SQL query statement below */
select id,
sum(case when month = 'Jan' then revenue else null end) as Jan_Revenue,
sum(case when month = 'Feb' then revenue else null end) as Feb_Revenue,
sum(case when month = 'Mar' then revenue else null end) as Mar_Revenue,
sum(case when month = 'Apr' then revenue else null end) as Apr_Revenue,
sum(case when month = 'May' then revenue else null end) as May_Revenue,
sum(case when month = 'Jun' then revenue else null end) as Jun_Revenue,
sum(case when month = 'Jul' then revenue else null end) as Jul_Revenue,
sum(case when month = 'Aug' then revenue else null end) as Aug_Revenue,
sum(case when month = 'Sep' then revenue else null end) as Sep_Revenue,
sum(case when month = 'Oct' then revenue else null end) as Oct_Revenue,
sum(case when month = 'Nov' then revenue else null end) as Nov_Revenue,
sum(case when month = 'Dec' then revenue else null end) as Dec_Revenue
from Department
group by id ---- 603ms
利用decode
进行修改,再次提交。
---- oracle ----
/* Write your PL/SQL query statement below */
select id,
sum(decode(month, 'Jan', revenue, null)) as Jan_Revenue,
sum(decode(month, 'Feb', revenue, null)) as Feb_Revenue,
sum(decode(month, 'Mar', revenue, null)) as Mar_Revenue,
sum(decode(month, 'Apr', revenue, null)) as Apr_Revenue,
sum(decode(month, 'May', revenue, null)) as May_Revenue,
sum(decode(month, 'Jun', revenue, null)) as Jun_Revenue,
sum(decode(month, 'Jul', revenue, null)) as Jul_Revenue,
sum(decode(month, 'Aug', revenue, null)) as Aug_Revenue,
sum(decode(month, 'Sep', revenue, null)) as Sep_Revenue,
sum(decode(month, 'Oct', revenue, null)) as Oct_Revenue,
sum(decode(month, 'Nov', revenue, null)) as Nov_Revenue,
sum(decode(month, 'Dec', revenue, null)) as Dec_Revenue
from Department
group by id ---- 947ms
记录一个MySQL
的用法。
---- MySQL ----
# Write your MySQL query statement below
select
`id`,
max(if(`month` = 'Jan', revenue, null)) as "Jan_Revenue",
max(if(`month` = 'Feb', revenue, null)) as "Feb_Revenue",
max(if(`month` = 'Mar', revenue, null)) as "Mar_Revenue",
max(if(`month` = 'Apr', revenue, null)) as "Apr_Revenue",
max(if(`month` = 'May', revenue, null)) as "May_Revenue",
max(if(`month` = 'Jun', revenue, null)) as "Jun_Revenue",
max(if(`month` = 'Jul', revenue, null)) as "Jul_Revenue",
max(if(`month` = 'Aug', revenue, null)) as "Aug_Revenue",
max(if(`month` = 'Sep', revenue, null)) as "Sep_Revenue",
max(if(`month` = 'Oct', revenue, null)) as "Oct_Revenue",
max(if(`month` = 'Nov', revenue, null)) as "Nov_Revenue",
max(if(`month` = 'Dec', revenue, null)) as "Dec_Revenue"
from
Department
group by `id`; ---- 229ms
思考
通过case when
进行判断的时候,例如:case when month = 'Jan' then revenue else null end as Jan_Revenue
,会导致每一条记录产生一行,与原来表格的行数一致,因为需要通过group by
对id
进行分组,但是分组之后一定需要一个聚合函数进行计算,此处就用max
即可。
oracle中if/else功能的实现方法
1.标准的SQL规范
-- 单个if
if a = xxx then
......
end if;
-- 多个条件
if a = xxx then
......
else
......
end if;
-- 多个if
if a = xxx then
......
elsif a = xxx then
......
end if;
---- 测试:在oracle中不用用于select中,只能用于存储过程
2.decode
函数
语法:decode(value, if1, then1, if2, then2, if3, then3,..., else)
解释:如果value等于if1时,decode
函数的结果返回then1,...,如果不等于任何一个if值,则返回else。
3.case when
case when a = '1' then 'xxxx'
when a = '2' then 'yyyy'
else
'zzzz'
end as column
注意点:
- 以 case 开头,以 end 结尾;
- 分支中 when 后跟条件,then 为显示结果;
- else 为除此之外的默认情况,类似于高级语言程序中 switch case 的 default,可以不加;
- end 后跟别名
LeetCode:1179.重新格式化部门表的更多相关文章
- 员工部门表综合查询SQL
--数据库的表设计如下: --部门:部门编号,部门名称,地址: --员工:员工编号,员工名字,职务,管理编号,入职日期,薪资,奖金,部门编号: --创建部门表: CREATE TABLE dept( ...
- java数据库 JDBC操作MySQL数据库常用API 部门表和员工表 创建表 添加数据 查询数据
package com.swift.department; import java.sql.Connection; import java.sql.PreparedStatement; import ...
- oracle员工表和部门表基本操作
emp 员工表(empno 员工号/ename 员工姓名/job 工作/mgr 上级编号/hiredate 受雇日期/sal 薪金/comm 佣金/deptno 部门编号) dept 部门表(dept ...
- Mysql 设计超市经营管理系统,包括员工信息表(employee)和 员工部门表(department)
互联网技术学院周测机试题(二) 一.需求分析 为进一步完善连锁超市经营管理,提高管理效率,减少管理成本,决定开发一套商品管理系统,用于日常的管理.本系统分为商品管理.员工管理.店铺管理,库存管理等功能 ...
- [LeetCode] Task Scheduler 任务行程表
Given a char array representing tasks CPU need to do. It contains capital letters A to Z where diffe ...
- hive学习04-员工部门表综合案例
知识点: 格式转换:cast(xxx as int) 按某列分桶某列排序,排序后打标机:例如:求每个地区工资最高的那个人的信息: ROW_NUMBER() OVER(PARTITION BY COLU ...
- Oracle PL/SQL块 多表查询(emp员工表、dept部门表、salgrade工资等级表)
范例: 查询每个员工的编号,姓名,职位,工资,工资等级,部门名称 ●确定要使用的数据表 |- emp表:员工的编号.姓名.职位.工资 |- salgrade表:工资等级 |- dept表:部门名称 ● ...
- C#LeetCode刷题-哈希表
哈希表篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 42.8% 简单 3 无重复字符的最长子串 24.2% 中等 18 四数之和 ...
- LeetCode通关:哈希表六连,这个还真有点简单
精品刷题路线参考: https://github.com/youngyangyang04/leetcode-master https://github.com/chefyuan/algorithm-b ...
随机推荐
- 网络时间协议 (SNTP)
sntp是简单网络时间协议(Simple Network Protocol)的客户端,可以用来查询或修正NTP服务器的时间和本地的时差. sntp可以以非交互模式运行或运行一个计划任务的脚本. snt ...
- centos7 mysql 启动mysqld.service - SYSV: MySQL database server错误
1.启动命令 systemctl start mysqld.service 或者 /etc/init.d/mysqld start 结果同样的错误 2.错误是: Job for mysqld.se ...
- socket常见问题
socket编程中主动关闭VS被动关闭 tcp中server,client都可能是主动关闭方或者被动关闭方,现阐述下两者之间的关系: 客户端(client) ...
- features its own
Gulp.js features its own built-in watch() method - no external plugin required ---- However, the Arn ...
- 9Flutter GridView组件 以及动态GridView
main.dart import 'package:flutter/material.dart'; import 'res/listData.dart'; /* GridView : 通过GridVi ...
- Response.setContentType()参数说明
response.setContentType()的参数说明 <meta http-equiv="Content-Type" content="text/html; ...
- 获取Xshell Xftp等官网下载地址
1. 首先还是得填写邮箱获取试用链接地址,例如我这次获取的是: https://cdn.netsarang.net/c5711331/Xshell-6.0.0175.exe 关键需要记下 c57113 ...
- DDD不是架构设计方法
DDD不是架构设计方法 一文读懂DDD 2019-05-28 19:18 by 春哥大魔王, 413 阅读, 3 评论, 收藏, 编辑 何为DDD DDD不是架构设计方法,不能把每个设计细节具象化,D ...
- 澎湃新闻速览版UWP 隐私策略
ThePaper UWP 此为 澎湃新闻速览版 的隐私策略,本隐私策略内容会不定期更新,以最新内容为主. 若您已经阅读并了解以下内容后,并继续使用该软件,即表示您已同意该协议. 内容: 这是澎湃新闻的 ...
- poj1556 The Doors(叉积判断线段相交)
题目链接:https://vjudge.net/problem/POJ-1556 题意:在一个矩形内,起点(0,5)和终点(10,5)是固定的,中间有n个道墙(n<=18),每道墙有两个門,求起 ...