SQL-leetcode—1179. 重新格式化部门表

1179. 重新格式化部门表

表 Department:

±--------------±--------+
| Column Name | Type |
±--------------±--------+
| id | int |
| revenue | int |
| month | varchar |
±--------------±--------+
在 SQL 中,(id, month) 是表的联合主键。
这个表格有关于每个部门每月收入的信息。
月份(month)可以取下列值 [“Jan”,“Feb”,“Mar”,“Apr”,“May”,“Jun”,“Jul”,“Aug”,“Sep”,“Oct”,“Nov”,“Dec”]。

重新格式化表格,使得 每个月 都有一个部门 id 列和一个收入列。

以 任意顺序 返回结果表。

结果格式如以下示例所示。

示例 1:

输入:
Department table:
±-----±--------±------+
| 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 列用于各个月份)。

题解

格式化表格,使得 每个月 都有一个部门 id 列和一个收入列

  • 经典的行转列,可以使用聚合函数+group by + case when来实现

方法一 SUM + group by

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

方法二 MAX + group by

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

方法三 MIN + group by

select
    id
    ,MIN(case when month='Jan' then revenue else null end) as Jan_Revenue
    ,MIN(case when month='Feb' then revenue else null end) as Feb_Revenue
    ,MIN(case when month='Mar' then revenue else null end) as Mar_Revenue
    ,MIN(case when month='Apr' then revenue else null end) as Apr_Revenue
    ,MIN(case when month='May' then revenue else null end) as May_Revenue
    ,MIN(case when month='Jun' then revenue else null end) as Jun_Revenue
    ,MIN(case when month='Jul' then revenue else null end) as Jul_Revenue
    ,MIN(case when month='Aug' then revenue else null end) as Aug_Revenue
    ,MIN(case when month='Sep' then revenue else null end) as Sep_Revenue
    ,MIN(case when month='Oct' then revenue else null end) as Oct_Revenue
    ,MIN(case when month='Nov' then revenue else null end) as Nov_Revenue
    ,MIN(case when month='Dec' then revenue else null end) as Dec_Revenue
from Department
group by id

可能一开始看到SUM、MAX、MIN会不理解为啥?

在这里插入图片描述
在这里插入图片描述

可以看下这2个图例呢?

中间分组的过程其实是内部存储的,无法查询出来的一个虚拟的结果,一个框是一个集合的内容,这样的话就比较好理解为啥用聚合函数了。

如果不使用聚合函数会怎么样呢?
如果不使用的话,行数不会减少,会和输入数据一样的行数,就需要考虑一个合并的问题了。
大致效果是:
1, 100,null,null,null,…
2,null,100,null,null,…
1,null,100,null,null,…

显然id=1的数据没有合并,违背了行转列的预期效果。

分析案例

解题思路
由于筛选结果中每个ID是一个记录 因此GROUP BY ID.
每个月份是一列,因此筛选每个月份时使用CASE [when…then…] END只取当前月份.
需要使用SUM()聚合函数 因为如果没有聚合函数 筛选出来的是
GROUP BY、CASE…END之后的第一行.

比如 Department 表:
+------+---------+-------+
| id   | revenue | month |
+------+---------+-------+
| 1    | 8000    | Jan   |
| 2    | 9000    | Jan   |
| 3    | 10000   | Feb   |
| 1    | 7000    | Feb   |
| 1    | 6000    | Mar   |
+------+---------+-------+

GROUP BY ID
+------+---------+-------+
| id   | revenue | month |
+------+---------+-------+
| 1    | 8000    | Jan   |
| 1    | 7000    | Feb   |
| 1    | 6000    | Mar   |
-------------------------
| 2    | 9000    | Jan   |
-------------------------
| 3    | 10000   | Feb   |
+------+---------+-------+


如果没有聚合函数 只输出第一行 比如
SELECT ID, (CASE WHEN MONTH='JAN' THEN REVENUE END) AS JAN_REVENUE, 
(CASE WHEN MONTH='FEB' THEN REVENUE END) AS FEB_REVENUE  
FROM DEPARTMENT GROUP BY ID
会输出
+------+-------------+-------------+
| ID   | JAN_REVENUE | FEB_REVENUE |
+------+-------------+-------------+
| 1    | 8000        | NULL        |
| 2    | 7000        | NULL        |
| 3    | NULL        | 10000       |
+------+-------------+-------------+
其中 ID=1 的 FEB_REVENUE 结果不对,这是因为 ID=1 时, (CASE WHEN MONTH='FEB' THEN REVENUE END)= [NULL, 7000, NULL], 没有聚合函数会只取第一个,即NULL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957901.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

城市生命线安全保障:技术应用与策略创新

城市生命线工程是维系城市正常运行、满足群众生产生活需要的重要基础设施。随着城市化进程的加快,城市基础设施生命线安全运行的复杂性日益加剧,保障城市居民日常生活正常运行的水、电、气、热等各类地下管线以及桥梁、市政设施、轨道交通等城市基础设施…

vue2的$el.querySelector在vue3中怎么写

这个也属于直接操作 dom 了,不建议在项目中这样操作,不过我是在vue2升级vue3的时候遇到的,是以前同事写的代码,也没办法 先来看一下对比 在vue2中获取实例是直接通过 this.$refs.xxx 获取绑定属性 refxxx 的实例,并且…

Genetic Prompt Search via Exploiting Language Model Probabilities

题目 利用语言模型概率的遗传提示搜索 论文地址:https://www.ijcai.org/proceedings/2023/0588.pdf 项目地址:https://github.com/zjjhit/gap3 摘要 针对大规模预训练语言模型(PLMs)的即时调优已经显示出显著的潜力,尤其是在诸如fewshot学习…

如何引导LabVIEW项目相关方合理参与项目?

引导 LabVIEW 项目相关方合理参与项目,是保障项目顺利推进的关键所在。合理引导,既能显著提升项目执行效率,又能让各方清晰知晓自身在项目中的角色与责任。以下为具体策略与建议: ​ 一、明确项目目标与需求 清晰沟通项目目标&a…

Maven的下载安装配置

maven的下载安装配置 maven是什么 Maven 是一个用于 Java 平台的 自动化构建工具,由 Apache 组织提供。它不仅可以用作包管理,还支持项目的开发、打包、测试及部署等一系列行为 Maven的核心功能 项目构建生命周期管理:Maven定义了项目构建…

光谱相机在智能冰箱的应用原理与优势

食品新鲜度检测 详细可点击查看汇能感知团队实验报告:高光谱成像技术检测食物新鲜度 检测原理:不同新鲜程度的食品,其化学成分和结构会有所不同,在光谱下的反射、吸收等特性也存在差异。例如新鲜肉类和蔬菜中的水分、蛋白质、叶…

MySQL可直接使用的查询表的列信息

文章目录 背景实现方案模板SQL如何查询列如何转大写如何获取字符位置如何拼接字段 SQL适用场景 背景 最近产品找来,想让帮忙出下表的信息,字段驼峰展示,每张表信息show create table全部展示,再逐个粘贴,有点太耗费时…

设计模式的艺术-享元模式

结构性模式的名称、定义、学习难度和使用频率如下表所示: 1.如何理解享元模式 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题。 在享元模式中,存储这些共享实例对象的地方称为享元池&…

汇编与逆向(二)-汇编基础

一、汇编入门 (一)x86体系的CPU的工作模式 有两种基本的工作模式:实模式和保护模式。 实模式:也称为实地址模式,该模式最早被DOS,win9x所支持。可访问1M内存,可直接访问硬件,如对…

Excel 技巧17 - 如何计算倒计时,并添加该倒计时的数据条(★)

本文讲如何计算倒计时,并添加该倒计时的数据条。 1,如何计算倒计时 这里也要用公式 D3 - TODAY() 显示为下面这个样子的 然后右键该单元格,选 设置单元格格式 然后点 常规 这样就能显示出还书倒计时的日数了。 下拉适用到其他单元格。 2&a…

1Panel开源面板项目GitHub Star数量突破25,000!

截至2025年1月22日8:00,飞致云旗下开源项目——1Panel开源Linux服务器运维管理面板GitHub Star数超过25,000个! 继Halo和JumpServer之后,1Panel成为飞致云旗下第三个GitHub Star数量超过25,000个的开源项目,也是飞致云旗下最快达…

高效安全文件传输新选择!群晖NAS如何实现无公网IP下的SFTP远程连接

文章目录 前言1. 开启群晖SFTP连接2. 群晖安装Cpolar工具3. 创建SFTP公网地址4. 群晖SFTP远程连接5. 固定SFTP公网地址6. SFTP固定地址连接 前言 随着远程办公和数据共享成为新常态,如何高效且安全地管理和传输文件成为了许多人的痛点。如果你正在寻找一个解决方案…

木材缺陷检测数据集VOC+YOLO格式8961张10类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):8961 标注数量(xml文件个数):8961 标注数量(txt文件个数):8961 …

后端开发Web

Maven Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具 Maven的作用 依赖管理 方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题 统一项目结构 提供标准、统一的项目结构 项目构建 标准跨平台(…

安卓程序作为web服务端的技术实现(二):Room 实现数据存储

已经实现web服务器安卓程序作为web服务端的技术实现:AndServer 实现登录权限拦截-CSDN博客 现在需要和正常web项目类似,那么就需要操作数据库 一般web项目都是选择较为重型的数据库如MySQL,SQL server等 这里是安卓项目,我目前…

FPGA与ASIC:深度解析与职业选择

IC(集成电路)行业涵盖广泛,涉及数字、模拟等不同研究方向,以及设计、制造、封测等不同产业环节。其中,FPGA(现场可编程门阵列)和ASIC(专用集成电路)是两种重要的芯片类型…

C语言程序设计十大排序—选择排序

文章目录 1.概念✅2.选择排序🎈3.代码实现✅3.1 直接写✨3.2 函数✨ 4.总结✅5.十大排序 1.概念✅ 排序是数据处理的基本操作之一,每次算法竞赛都很多题目用到排序。排序算法是计算机科学中基础且常用的算法,排序后的数据更易于处理和查找。在…

使用LPT wiggler jtag自制三星单片机(sam88 core)编程器-S3F9454

写在前面 新年好,各位,今天来分享制作一个三星单片机的编程器 嘿嘿,x鱼垃圾佬元件库有些三星单片机s3f9454,编程器不想买,基本拿来拆件玩的。但,前些时候csdn下载到它的编程时序,自己来做个编程…

麦田物语学习笔记:保存和加载场景中的物品

目录 基本流程 1.代码思路 2.代码实现 最终效果 补充知识点 1.序列化 2.委托 基本流程 现在在切换场景后,场景中的物品即使被拾取了,也还是会被重新加载出来,所以本篇文章的任务是在切换场景前后能保留当前场景的数据 1.代码思路 (1)为了保留处在地上的物品数据,就需要…

机器学习-K近邻算法

文章目录 一. 数据集介绍Iris plants dataset 二. 代码三. k值的选择 一. 数据集介绍 鸢尾花数据集 鸢尾花Iris Dataset数据集是机器学习领域经典数据集,鸢尾花数据集包含了150条鸢尾花信息,每50条取自三个鸢尾花中之一:Versicolour、Setosa…