数据库的透视

在力扣做到这个题的时候,了解到了透视的概念,下面记录一下我对透视的理解,以及透视需要解决的一个很关键的问题。

一、题目描述

这个题要求重新格式化当前的表
表 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 列和一个收入列。
比如:表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        |
+------+-------------+-------------+-------------+-----+-------------+

新表中包括了id和12个月,每个月的数据来源于旧表的revenue,这种变换方式叫做透视。

二、透视

相关定义:

一在数据库和电子表格中,透视是一种将行转换成列的操作。
比如,如果你有一张表记录了每个月的收入,透视就可以帮你把每个月作为一个单独的列显示,这样每一行就代表一个特定的ID,而每一列就表示不同月份的收入。
👆也就是说,重新整理这张表,新表的每一行整合旧表的多行数据,放在了不同列上。

会出现的问题:

在初始接触这个题时,我的写法是这样的:

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

然后结果是这样的:

| id | Jan_Revenue | Feb_Revenue | Mar_Revenue | Apr_Revenue | May_Revenue | Jun_Revenue | Jul_Revenue | Aug_Revenue | Sep_Revenue | Oct_Revenue | Nov_Revenue | Dec_Revenue |
| -- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- |
| 1  | 8000        | null        | null        | null        | null        | null        | null        | null        | null        | null        | null        | null        |
| 2  | 9000        | null        | null        | null        | null        | null        | null        | null        | null        | null        | null        | null        |
| 3  | null        | 10000       | null        | null        | null        | null        | null        | null        | null        | null        | null        | null        |

可以看到,每一行id,只有一个月的结果,结果出错。

原因:

在一般写法(不使用聚合函数)中,新表的一行数据只能来源于旧表的一行数据,所以会出现只有一列被正确赋值的情况,要解决的话,一定要让新表的一行数据来源于旧表的一组数据(多行数据),所以需要使用group by和聚合函数。

解决

正确代码如下:

SELECT id,MAX(CASE WHEN month = 'Jan' THEN revenue END) AS Jan_Revenue,MAX(CASE WHEN month = 'Feb' THEN revenue END) AS Feb_Revenue,MAX(CASE WHEN month = 'Mar' THEN revenue END) AS Mar_Revenue,MAX(CASE WHEN month = 'Apr' THEN revenue END) AS Apr_Revenue,MAX(CASE WHEN month = 'May' THEN revenue END) AS May_Revenue,MAX(CASE WHEN month = 'Jun' THEN revenue END) AS Jun_Revenue,MAX(CASE WHEN month = 'Jul' THEN revenue END) AS Jul_Revenue,MAX(CASE WHEN month = 'Aug' THEN revenue END) AS Aug_Revenue,MAX(CASE WHEN month = 'Sep' THEN revenue END) AS Sep_Revenue,MAX(CASE WHEN month = 'Oct' THEN revenue END) AS Oct_Revenue,MAX(CASE WHEN month = 'Nov' THEN revenue END) AS Nov_Revenue,MAX(CASE WHEN month = 'Dec' THEN revenue END) AS Dec_Revenue
FROM Department
GROUP BY id;

说明:使用max不是真的为了得到什么最大值,而是为了利用聚合函数,使得当前行的数据能来源于旧表的多行。

结果展示:

| id | Jan_Revenue | Feb_Revenue | Mar_Revenue | Apr_Revenue | May_Revenue | Jun_Revenue | Jul_Revenue | Aug_Revenue | Sep_Revenue | Oct_Revenue | Nov_Revenue | Dec_Revenue |
| -- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- | ----------- |
| 1  | 8000        | 7000        | 6000        | null        | null        | null        | null        | null        | null        | null        | null        | null        |
| 2  | 9000        | null        | null        | null        | null        | null        | null        | null        | null        | null        | null        | null        |
| 3  | null        | 10000       | null        | null        | null        | null        | null        | null        | null        | null        | null        | null        |

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端面试高频: 理解 React/Vue 中 Key 的作用

一: 引言 在 React 或 Vue 项目中,我们经常在列表组件中使用key属性。key是给每一个vnode的唯一id,它在列表渲染和虚拟 DOM 操作中扮演着重要的角色。 当我们在渲染一个包含多个相同子组件的列表时,如果没有使用 key,React 或 Vue…

666666666666666666

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

Linux (Ubuntu)- mysql8 部署

目录 1.基本部署 2.修改密码 3.开启root可远程连接配置 1.基本部署 01》》先查看OS类型,如果是Ubuntu在往下边看 rootspray:/etc/mysql/mysql.conf.d# lsb_release -a LSB Version: core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch Distributor ID: …

备战蓝桥杯---线段树应用2

来几个不那么模板的题: 对于删除,我们只要给那个元素附上不可能的值即可,关键问题是怎么处理序号变化的问题。 事实上,当我们知道每一个区间有几个元素,我们就可以确定出它的位置,因此我们可以再维护一下前…

Windows Edge 兼容性问题修复

修复Windows Edge兼容性问题的方法 如果你在使用Windows Edge浏览器时遇到了兼容性问题,可以尝试以下几种方法来解决: 方法一:更改注册表 使用WinR组合键打开运行对话框。在运行对话框中输入regedit并按回车键,打开注册表编辑器…

RK3568测试

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…

非关系型数据库------------Redis的安装和部署

目录 一、关系型数据库与非关系型数据库 1.1关系型数据库 1.2非关系型数据库 1.2.1非关系型数据库产生背景 1.3关系型非关系型区别 1.4客户访问时,关系型数据库与redis的工作过程 二、Redis 2.1redis简介 2.2Redis命中机制和淘汰机制 2.3Redis 具有以下优…

在Ubuntu 14.04上如何备份和恢复Redis数据

简介 Redis 是一个内存中的键值缓存和存储(也可以是数据库),同时也可以持久化(永久保存)到磁盘上。在本文中,您将了解如何在 Ubuntu 14.04 服务器上备份 Redis 数据库。 默认情况下,Redis 数据…

Day45 动态规划 part07

Day45 动态规划 part07 57. 爬楼梯(卡码网) 我的思路: 和昨天的组合总和题几乎一模一样的代码 解答: import java.util.*;public class Main {public static void main (String[] args) {Scanner myScanner new Scanner(Syst…

【torch-gpu】手动快速安装

cuda11.7就选cu117 python3.8就选cp38 windows就选win 安装torch 进入官网 https://download.pytorch.org/whl/torch/ 搜索 torch-2.0.1cu117-cp38-cp38-win_amd64.whl 安装torchvision 进入官网 https://download.pytorch.org/whl/torchvision/ 搜索 torchvision-0.15.2cu…

树莓派安装Windows搭建网盘和下载机

0 需求分析 在同一个局域网内,同时有多种设备(Windows,Linux,Android)需要进行大量的数据共享。另外,还时常需要从百度网盘/夸克网盘等网盘下载文件。不难看出,我的需求很简单,就是…

提醒:2024年思维100春季线上比赛今天报名截止,来看官方样题

【温馨提醒】今天是2024年4月6日,是2024年春季思维100活动第一阶段线上比赛报名的截止日期。如果要参赛,请设置好闹钟别错过了报名。更多安排和需要提前了解的关键点可以见我前面写的文章,或者直接联系我获取相关资料。 官方发布的2024年春季…

汽车网络安全管理

汽车网络安全管理 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事&#xff0c…

使用阿里云试用Elasticsearch学习:2.4 深入搜索——近似匹配

使用 TF/IDF 的标准全文检索将文档或者文档中的字段作一大袋的词语处理。 match 查询可以告知我们这大袋子中是否包含查询的词条,但却无法告知词语之间的关系。 思考下面这几个句子的不同: Sue ate the alligator.The alligator ate Sue.Sue never goe…

javaweb学习(day11-监听器Listener过滤器Filter)

一、监听器Listener 1 Listener介绍 Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程 序、Listener 监听器、Filter 过滤器 Listener 是 JavaEE 的规范,就是接口 监听器的作用是,监听某种变化(一般就是对…

Java零基础入门-递归

一、概述 上一期,我们是具体学习了File类的一些概念基础知识点,以及对于该类的常用方法进行了一个全量举例演示,这也是考虑到有的小伙伴在阅读的同时,没有时间去实际测试,所以我也就顺带的给大家去做了实例演示&#x…

数据生成 | Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成

数据生成 | Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成 目录 数据生成 | Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成生成效果基本描述模型描述程序设计参考资料 生成效果 基本描述 1.Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成&#xf…

【实现100个unity特效之7】unity 3d实现各种粒子效果

文章目录 先看最终效果下雨效果萤火虫和火花四溅的效果 3d下雨粒子效果涟漪效果雨滴和涟漪效果结合水花效果雨滴涟漪水花结合问题雾气效果萤火虫火花效果萤火虫和火花效果结合其他特效爆炸、闪电、火焰、雷雨特效(2023/7/5更新)源码完结 先看最终效果 下…

爬虫 新闻网站 并存储到CSV文件 以红网为例 V2.0 (控制台版)升级自定义查询关键词、时间段,详细注释

爬虫:红网网站, 获取指定关键词与指定时间范围内的新闻,并存储到CSV文件 V2.0(控制台版) 爬取目的:为了获取某一地区更全面的在红网已发布的宣传新闻稿,同时也让自己的工作更便捷 对比V1.0升级的…

达梦体系结构:进程架构

达梦体系结构:进程架构 进程结构监听线程会话线程工作线程IO线程日志刷盘线程日志归档线程日志重做线程调度线程检查点线程 达梦数据库由数据库和实例构成: 数据库是指磁盘上存放的数据库文件的集合,包括参数文件、控制文件、数据文件、日志…