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
selectid,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
selectid,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
selectid,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
相关文章:

SQL-leetcode—1179. 重新格式化部门表
1179. 重新格式化部门表 表 Department: ---------------------- | Column Name | Type | ---------------------- | id | int | | revenue | int | | month | varchar | ---------------------- 在 SQL 中,(id, month) 是表的联合主键。 这个表格有关…...

JavaWeb 学习笔记 XML 和 Json 篇 | 020
今日推荐语 愿你遇见好天气,愿你的征途铺满了星星——圣埃克苏佩里 日期 学习内容 打卡编号2025年01月23日JavaWeb笔记 XML 和 Json 篇020 前言 哈喽,我是菜鸟阿康。 以下是我的学习笔记,既做打卡也做分享,希望对你也有所帮助…...
在Raspbian上,如何获取树莓派的CPU当前频率
本文不用汇编实现,因为我是要用在 Go 里的,Go 并不支持内联汇编,要用汇编比较麻烦。而且项目并不是很在意性能,所以直接用命令获取内核准备好的。 在Raspbian上,CPU 信息存放在/sys/devices/system/cpu/中,…...
网络打印机的搜索与连接(一)
介绍 网络打印机就是可以通过网络连接上的打印机,这类打印机分2种:自身具有互联网接入功能可以分配IP的打印机我们称为网络打印机、另外一种就是被某台电脑连接上去后通过共享的方式共享到网络里面的我们称为共享打印机。现在还有一种可以通过互联网连接…...

LangChain + llamaFactory + Qwen2-7b-VL 构建本地RAG问答系统
单纯仅靠LLM会产生误导性的 “幻觉”,训练数据会过时,处理特定知识时效率不高,缺乏专业领域的深度洞察,同时在推理能力上也有所欠缺。 正是在这样的背景下,检索增强生成技术(Retrieval-Augmented Generati…...

【自然语言处理(NLP)】介绍、发展史
文章目录 介绍发展史1. 规则驱动时期(20世纪50年代-80年代)技术特点标志性成果 2. 统计方法兴起(1990年代-2000年代)技术特点标志性成果 3. 神经网络复兴(2010年代初至今)技术特点标志性成果 4. 集成与应用…...

1.CSS的三大特性
css有三个非常重要的三个特性:层叠性、继承性、优先级 1.1 层叠性 想通选择器给设置想听的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要是解决样式冲突的问题。 <!DOCTYPE html> <html lang"en&…...

【分布式日志篇】从工具选型到实战部署:全面解析日志采集与管理路径
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

基于springcloud汽车信息分析与可视化系统
基于Spring Cloud的汽车信息分析与可视化系统是一款旨在整合、分析汽车相关数据并以直观可视化方式呈现的应用系统。 一、系统架构 该系统基于先进的Spring Cloud架构构建,充分利用其分布式、微服务特性,确保系统具备高可用性、可扩展性和灵活性。Spri…...

TOGAF之架构标准规范-信息系统架构 | 数据架构
TOGAF是工业级的企业架构标准规范,信息系统架构阶段是由数据架构阶段以及应用架构阶段构成,本文主要描述信息系统架构阶段中的数据架构阶段。 如上所示,信息系统架构(Information Systems Architectures)在TOGAF标准规…...

Databend x 沉浸式翻译 | 基于 Databend Cloud 构建高效低成本的业务数据分析体系
「沉浸式翻译」是一个非常流行的双语对照网页翻译扩展工具,用户可以用它来即时翻译外文网页、PDF 文档、ePub 电子书、字幕等。它不仅可以实现原文加译文实时双语对照显示,还支持 Google、OpenAI、DeepL、微软、Gemini、Claude 等数十家翻译平台服务的自…...
cuda的并行运算介绍
cuda是如何使用GPU并行运算的: 以一个函数为例: duplicateWithKeys << <(P 255) / 256, 256 >> > (P,geomState.means2D,geomState.depths,geomState.point_offsets,binningState.point_list_keys_unsorted,binningState.point_list_…...

「全网最细 + 实战源码案例」设计模式——抽象工厂模式
核心思想 抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建一系列相关或互相依赖的对象,而无需指定它们的具体类。抽象工厂模式解决了产品族的问题,可以管理和创建一组相关的产品。 结构 1. 抽象工厂 定义创建一些列…...
领域驱动设计(DDD)四 订单管理系统实践步骤
以下是基于 领域驱动设计(DDD) 的订单管理系统实践步骤,系统功能主要包括订单的创建、更新、查询和状态管理,采用 Spring Boot 框架进行实现。 1. 需求分析 订单管理系统的基本功能: 订单创建:用户下单创…...
leetcode 面试经典 150 题:简化路径
链接简化路径题序号71题型字符串解法栈难度中等熟练度✅✅✅ 题目 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为 更加简洁的规范路径。 在 Unix 风格的文件系统中规则如下…...

基于 STM32 的智能农业温室控制系统设计
1. 引言 随着农业现代化的发展,智能农业温室控制系统对于提高农作物产量和质量具有重要意义。该系统能够实时监测温室内的环境参数,如温度、湿度、光照强度和土壤湿度等,并根据这些参数自动调节温室设备,如通风扇、加热器、加湿器…...

【Spring Boot】掌握 Spring 事务:隔离级别与传播机制解读与应用
前言 🌟🌟本期讲解关于spring 事务传播机制介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话…...

【Postgres_Python】使用python脚本将多个PG数据库合并为一个PG数据库
需要合并的多个PG数据库表个数和结构一致,这里提供一种思路,选择sql语句insert插入的方式进行,即将其他PG数据库的每个表内容插入到一个PG数据库中完成数据库合并 示例代码说明: 选择一个数据库导出表结构为.sql文件(…...

Tailwind CSS v4.0 发布
Holy shit its actually done ! 1 月 22 日,Tailwind CSS 正式发布了 4.0 版本,针对性能和灵活性进行了优化,重新构想了配置和定制体验,并充分利用了 Web 平台提供的最新进展。 新的高性能引擎- 完整构建速度提高 5 …...

pandas基础:文件的读取和写入
文件的读取和写入 读取csv文件 csv文件: name,age,city Alice,25,New York Bob,30,Los Angelesread_csv(filename) header:如 何处理文件的第一行。header0将第一行作为列名,headerNone表示文件中没有列名,所有行都是数据。 im…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

GAN模式奔溃的探讨论文综述(一)
简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...

高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
ffmpeg(三):处理原始数据命令
FFmpeg 可以直接处理原始音频和视频数据(Raw PCM、YUV 等),常见场景包括: 将原始 YUV 图像编码为 H.264 视频将 PCM 音频编码为 AAC 或 MP3对原始音视频数据进行封装(如封装为 MP4、TS) 处理原始 YUV 视频…...