MySQL系列之行转列,列转行

news2024/11/25 7:05:50

MySQL系列之行转列,列转行

之前业务出现了需要行转列的场景,记录一下

SQL中AVG、COUNT、SUM、MAX等聚合函数对NULL值的处理

Mysql Max、 Where和 Group By 三个关键字同时使用 执行顺序

MySql 行转列的玩法 ,实战案例教学(MAX函数的坑简析)(本文主要参考该博主的文章)

行转列方式(个人比较推荐第三种)

使用该文章作者的数据库设计https://blog.csdn.net/qq_35387940/article/details/128264385

CREATE TABLE `env_climate` (
    `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
    `area` VARCHAR(50) NULL DEFAULT NULL COMMENT '地区' COLLATE 'utf8_general_ci',
    `item_name` VARCHAR(50) NULL DEFAULT NULL COMMENT '参数项名' COLLATE 'utf8_general_ci',
    `item_value` VARCHAR(50) NULL DEFAULT NULL COMMENT '参数项值' COLLATE 'utf8_general_ci',
    `item_value2` int(12) NULL DEFAULT NULL COMMENT '参数项值2' COLLATE 'utf8_general_ci',
    `date` VARCHAR(50) NULL DEFAULT NULL COMMENT '日期' COLLATE 'utf8_general_ci',
    PRIMARY KEY (`id`) USING BTREE
)
COMMENT='环境气候表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;
INSERT INTO `env_climate` (`id`, `area`, `item_name`, `item_value`,`item_value`, `date`) VALUES (1, '深圳', '温度', '12',2, '2022-11-01');
INSERT INTO `env_climate` (`id`, `area`, `item_name`, `item_value`,`item_value`, `date`) VALUES (2, '深圳', '湿度', NULL,2, '2022-11-01');
INSERT INTO `env_climate` (`id`, `area`, `item_name`, `item_value`,`item_value`, `date`) VALUES (3, '深圳', '光照', '1300',2, '2022-11-01');
INSERT INTO `env_climate` (`id`, `area`, `item_name`, `item_value`,`item_value`, `date`) VALUES (4, '成都', '温度', '45',2, '2022-11-01');
INSERT INTO `env_climate` (`id`, `area`, `item_name`, `item_value`,`item_value`, `date`) VALUES (5, '成都', '湿度', '32',2, '2022-11-01');
INSERT INTO `env_climate` (`id`, `area`, `item_name`, `item_value`,`item_value`, `date`) VALUES (6, '成都', '光照', '1300',2, '2022-11-01');
INSERT INTO `env_climate` (`id`, `area`, `item_name`, `item_value`,`item_value`, `date`) VALUES (7, '成都', '湿度', '32',2, '2022-11-02');
INSERT INTO `env_climate` (`id`, `area`, `item_name`, `item_value`,`item_value`, `date`) VALUES (8, '成都', '温度', '26',2, '2022-11-02');
INSERT INTO `env_climate` (`id`, `area`, `item_name`, `item_value`,`item_value`, `date`) VALUES (9, '成都', '光照', '230',2, '2022-11-02');
INSERT INTO `env_climate` (`id`, `area`, `item_name`, `item_value`,`item_value`, `date`) VALUES (10, '深圳', '温度', '26',2, '2022-11-02');
INSERT INTO `env_climate` (`id`, `area`, `item_name`, `item_value`,`item_value`, `date`) VALUES (11, '深圳', '湿度', '34',2, '2022-11-02');
INSERT INTO `env_climate` (`id`, `area`, `item_name`, `item_value`,`item_value`, `date`) VALUES (12, '深圳', '光照', '5000',2, '2022-11-02');
 

image-20230716201448503

groupby和min()/max()(不太推荐)

SELECT DATE AS '日期', AREA,
MAX(CASE WHEN item_name='温度' THEN item_value ELSE '--'END) AS "温度",
MAX(CASE WHEN item_name='湿度' THEN item_value ELSE '--'END) AS "湿度",
MAX(CASE WHEN item_name='光照' THEN item_value ELSE '--'END) AS "光照"
FROM env_climate
GROUP BY AREA, DATE

image-20230716201448503

在以下情况会异常

SELECT DATE AS '日期', AREA,
MAX(CASE WHEN item_name='温度' THEN item_value ELSE '--'END) AS "温度",
MAX(CASE WHEN item_name='湿度' THEN item_value ELSE '无'END) AS "湿度",
MAX(CASE WHEN item_name='光照' THEN item_value ELSE '--'END) AS "光照"
FROM env_climate
GROUP BY AREA, DATE

可见所有湿度均为0,这是因为‘无’这个字的字典序比任意的一项item_value都要大,而且这个字典序和建立数据库或建表设置的字符编码有关

比如11-01的深圳这天,

MAX(CASE WHEN item_name=‘湿度’ THEN item_value ELSE '无’END) AS “湿度”

会在三个数据内对比,12,null,1300,,经过case when处理后结果是,无,null,无,这三个中字典序最大的是无,所以显示的无,其他同理

所以这个需要你了解else设置的默认值和item_value的字典序哪个大,如果是数字类型,在编码集中是连续的,需要你确实好要设置的默认值的编码序列大于任何一个数字,或者是使用min()设置比任何数字编码序列小的默认值,这是很繁琐的,所以不推荐

image-20230716202126795

groupby和sum()(不太推荐)

SELECT DATE AS '日期', AREA AS '地区',
SUM(CASE WHEN item_name='温度' THEN item_value ELSE '--'END) AS "温度",
SUM(CASE WHEN item_name='湿度' THEN item_value ELSE '--'END) AS "湿度",
SUM(CASE WHEN item_name='光照' THEN item_value ELSE '--'END) AS "光照"
FROM env_climate
GROUP BY AREA, DATE

image-20230716201558550

不太推荐这种,因为0一般是有实际意义的,就比如温度有时候可以为0摄氏度,这和没有获取到数据是两回事

还有就算对无法转成数字类型的字符串类型,会把结果置为0,就算你用CASE WHEN item_name=‘湿度’ THEN item_value **ELSE ‘–’**END也没有任何作用

因为sum的固定返回值是double类型,但max可以返回定义的else值,因为他除了可以比较数值类型的大小,还能比较字符类型的字典序,但他有别的问题,后面会谈到这个问题

image-20230716202055432

groupby和group_concat()(推荐)

SELECT DATE AS '日期', AREA,
    group_concat(CASE WHEN item_name = '温度' THEN item_value END SEPARATOR '') '温度',
    group_concat(CASE WHEN item_name = '湿度' THEN item_value END SEPARATOR '') '湿度',
    group_concat(CASE WHEN item_name = '光照' THEN item_value END SEPARATOR '') '光照'
FROM env_climate
GROUP BY DATE,AREA;

image-20230716201838215

这种暂时未发现问题

列转行方式

主要是使用union

挖坑后补

MAX()及MIN()误区

groupby及聚合函数误区

聚合函数对null值的处理

AVG()忽略null,而不是作为0参与计算

COUNT(*) 计数不忽略null

COUNT(字段名)忽略null

MAX(),MIN()都忽略null

SUM()忽略null(可以对单个列求和,也可以对多个列运算后求和,且当对多个列运算求和时,如果运算的列中任意一列的值为NULL,则忽略这行的记录)

image-20230716195535765

SELECT DATE AS '日期', AREA,
       sum(item_value+item_value2)
FROM env_climate
GROUP BY DATE,AREA;

image-20230716195841711

可见结果是1316,未统计11-01当天湿度的item_value2值

但是单列sum()无任何影响,因为就算按null为0,对结果也没有任何影响

SELECT DATE AS '日期', AREA,
       sum(item_value)
FROM env_climate
GROUP BY DATE,AREA;

image-20230716200255073

grouby的注意事项

1、分组列中若有NULL,这也将作为一组,且NULL值排在最前面

2、除汇总函数计算语句外,SELECT中的选择列必须出现在GROUP BY 中(这个可以通过更改sqlmode的ONLY_FULL_GROUP_BY绕过这一限制)

3、GROUP BY 可以包含任意数目的列,可以嵌套

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

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

相关文章

Eolink Apikit,0 代码可拖拽的自动化测试神器

目录 一、从测试到可拖拽的自动化测试二、0 代码,图形化,好用到飞起通过图形化操作、拖拽的方式搭建测试流程 三、Eolink Apikit,一站式 API 研发协作平台1、多协议支持2、多种数据重用3、报告、分析、告警4、支持持续集成和部署 四、Apikit …

QT基础入门之文件操作

一、概述 Qt 作为一个通用开发库,提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。下面是 I/O 设备的类图: QIODevice:所有I/O设备类的父类,提供字节块读写的通…

Sentinel流量规则模块(降级)

sentinel的常见页面的简介 流控是对外部来的大流量进行控制,熔断降级的视角是对内部问题进行处理。 Sentinel降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,…

【JDBC系列】- jdbc的概念以及与数据库的交互流程

【JDBC系列】- jdbc的概念以及与数据库的交互流程 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享学习…

oc UITableView 列表

// // ViewController.m // OcDemoTest // // Created by Mac on 2023/7/14. //#import "ViewController.h" // 添加协议 interface ViewController ()<UITableViewDataSource> property (weak, nonatomic) IBOutlet UITableView *tableView;endimplementat…

Node中的的util.promisify()方法的介绍和基本实现

异步编程解决方案 我们知道&#xff0c;在JS中实现异步编程主要是通过以下几种方案&#xff1a; 回调函数&#xff1a;也是在ES6之前用的最多的方式&#xff0c;缺点是容易造成callback hell&#xff0c;可读性很差观察者模式&#xff1a;在NodeJS中的很多模块都继承了EventE…

二分搜索树节点删除

本小节介绍二分搜索树节点的删除之前&#xff0c;先介绍如何查找最小值和最大值&#xff0c;以及删除最小值和最大值。 以最小值为例&#xff08;最大值同理&#xff09;&#xff1a; 查找最小 key 值代码逻辑&#xff0c;往左子节点递归查找下去&#xff1a; ... // 返回以…

3.4 Bootstrap 按钮下拉菜单

文章目录 Bootstrap 按钮下拉菜单分割的按钮下拉菜单按钮下拉菜单的大小按钮上拉菜单 Bootstrap 按钮下拉菜单 本章将讲解如何使用 Bootstrap class 向按钮添加下拉菜单。如需向按钮添加下拉菜单&#xff0c;只需要简单地在在一个 .btn-group 中放置按钮和下拉菜单即可。您也可…

❤️创意网页:如何用HTML制作菜单栏?制作好看的菜单栏样式网页

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

ChatGPT流量下降?原因竟是学生放暑假,秋季或将回暖

ChatGPT是一款由OpenAI开发的人工智能聊天机器人&#xff0c;它能够进行自然语言对话&#xff0c;并支持用户在写作业、进行研究等方面提供帮助。许多人认为它是历史上增长最快的科技产品之一&#xff0c;但近期却观察到其流量下降的现象。 根据Similarweb和其他机构在本月初发…

el-image-viewer图片预览组件使用

只需要安装了element-plus即可使用 <template><div class"preview-box"><!-- 第一种: 使用el-image - 通过点击小图, 然后预览大图, 这是官方文档提供的方法 --><el-image :preview-src-list"[/api/file/getImage/202307/3178033358P0KiZ…

基于Javaweb实现ATM机系统开发实战(十三)交易记录查看实现

老规矩&#xff0c;先看前端传递怎样的数据&#xff0c;已经把要展示数据的变量名都改了&#xff1a; <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <% taglib prefix"c" uri"…

7、网络层(地址管理和路由选择)IP31

网络层&#xff1a;负责地址管理和路由选择 IP协议&#xff0c;路由器 一、IP协议 4位协议版本号&#xff1a;4/6 -ipv4、ipv6 4位报头长度&#xff1a;以4B为单位描述报头大小&#xff0c;IP报头最大60B最小20B 8位服务类型&#xff1a;3位优先权字段弃用&#xff0c;1位保留…

Circular lollipop | 哇咔咔!!!环形棒棒糖图好吃又好玩!~

1写在前面 今天不想废话了&#xff0c;直接看图吧。&#x1f447; 复现代码step by step&#xff0c;自己看吧。&#x1f92a; 2用到的包 rm(list ls())library(tidyverse)library(ggtext)library(patchwork) 3示例数据 df_pw <- read.csv("./passwords.csv",row…

浅析 Io 处理

文件流&#xff1a; 在Java 中&#xff0c;文件流负责操作文件&#xff0c;包括读取和写入&#xff1b; FileInputStream // 文件的字节输入流&#xff1b; FileOutputStream // 文件的字节输出流&#xff1b; FileReader // 文件的字符输入流&#xff1b; FileWriter // 文…

Python基于百度智能云平台股票资讯情感分析

Python基于百度智能云平台股票资讯情感分析 全部代码和数据地址如下&#xff1a;Python基于百度智能云平台股票资讯情感分析 本文章详细内容如下&#xff1a; 文章目录 Python基于百度智能云平台股票资讯情感分析导入相应的包1.引入库2.设置账户秘钥3.导入数据4.数据合并5.百度…

10年测试老鸟总结,性能测试-性能内存瓶颈分析(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试-内存瓶颈…

【2023 年第三届长三角高校数学建模竞赛】B 题 长三角新能源汽车发展与双碳关系研究 18页论文、数据和代码

【2023 年第三届长三角高校数学建模竞赛】B 题 长三角新能源汽车发展与双碳关系研究 18页论文、数据和代码 1 题目 《节能与新能源汽车技术路线图 2.0》提出至 2035 年&#xff0c;新能源汽车市场占比超过 50%&#xff0c;燃料电池汽车保有量达到 100 万辆&#xff0c;节能汽车…

windows11 安装cuda和cudnn深度学习开发环境

首先先要确认自己的显卡最高能支持到cuda的版本&#xff0c;一般是不限制版本号的。 然后在官网地址下载&#xff1a; cuDNN的官网下载地址&#xff1a;cuDNN Archive | NVIDIA Developer CUDA 的下载地址&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 有一点需要注…

Jetpack:DataBinding

目录 一、DataBinding简介 设置 Data Binding 数据绑定表达式 双向绑定 二、例子 MainActivity &#xff1a; Food: activity_main: build.gradle: 运行结果&#xff1a; 三、总结 一、DataBinding简介 DataBinding 是一种用于在安卓应用中实现简洁、高效的数据绑定的…