当前位置: 首页 > news >正文

GaussDB数据库SQL系列-行列转换

一、前言

二、简述

1、行转列概念

2、列转行概念

三、GaussDB数据库的行列转行实验示例

1、行转列示例

1)创建实验表(行存表)

2)静态行转列

3)行转列(结果值:拼接式)

4)动态行转列(拼接SQL式)

2、列转行示例

1)创建实验表(复用前面的测试数据)

2)使用union all,将各科目(数学、英语、语文)整合为一列

四、小结

一、前言

在构建数据仓库或做数据分析时,需要对原始数据的结构进行一定的处理,有时涉及到“行转列”,有时涉及到“列转行”,那么这两个转换的方式具体是什么,有什么差异,怎么实现,今天我们将以GaussDB数据库为例,给大家做一下讲解。

二、简述

1、行转列概念

即将多行一列数据转为一行多列显示。通常转化后将某一列分类后的值作为新的列名,将此值对应的多行数据显示成一行。

2、列转行概念

即将一行多列数据转成多行一列显示。通常将转化后的列名为某一行中某一列的值,来识别原先对应的数据。

三、GaussDB数据库的行列转行实验示例

用一张学生成绩来举例:从老师的角度,在录入成绩时,每科老师都会单独录入每个学生的本科成绩。而从学生的角度,学生只关心自己各科的成绩分别是多少。所以如果把老师录入数据作为原始表,那么学生查看自己的成绩时就要用到行转列,如果让学生上报自己各科的成绩,然后老师去查对应学科的学生考试成绩时,那就是列转行了。

1、行转列示例

1)创建实验表(行存表)

--创建实验表(行存表)
CREATE TABLE grade(
name VARCHAR(10)
,course VARCHAR(10)
,score INT);--初始化测试数据
INSERT INTO grade VALUES ('张三','数学',80);
INSERT INTO grade VALUES ('张三','英语',88);
INSERT INTO grade VALUES ('张三','语文',95);
INSERT INTO grade VALUES ('李四','数学',88);
INSERT INTO grade VALUES ('李四','英语',70);
INSERT INTO grade VALUES ('李四','语文',93);--查看结果
SELECT * FROM grade ORDER BY course;

2)静态行转列

使用sum、case when的方式:

--静态行转列
SELECT name ,sum(case when course = '数学' then score else 0 end) AS "数学",sum(case when course = '英语' then score else 0 end) AS 英语,sum(case when course = '语文' then score else 0 end) AS 语文
FROM grade 
GROUP BY name;

3)行转列(结果值:拼接式)

使用listagg within group:

--行转列(结果值:拼接式)
SELECT name, LISTAGG(score,',') WITHIN GROUP (ORDER BY course) FROM grade GROUP BY name;

4)动态行转列(拼接SQL式)

通过“listagg + 创建FUNCTION + VIEW”的方式实现

--动态行转列(SQL拼接式)
SELECT listagg(concat('SUM(CASE WHEN course = ''', course, ''' THEN score ELSE 0 END) AS "', course,'"'),',') WITHIN GROUP(ORDER BY 1) AS concat_text FROM (SELECT DISTINCT course FROM grade);--concat_text的结果:
SUM(CASE WHEN course = '数学' THEN score ELSE 0 END) AS "数学",SUM(CASE WHEN course = '英语' THEN score ELSE 0 END) AS "英语",SUM(CASE WHEN course = '语文' THEN score ELSE 0 END) AS "语文"--创建一个函数。
CREATE OR REPLACE FUNCTION fun_test()
RETURNS VOID
LANGUAGE SQL
AS $$ DECLARE
s_sql text;
rec record;
BEGIN        s_sql := 'SELECT listagg(CONCAT(''SUM(CASE WHEN course = '''''', course, '''''' THEN score ELSE 0 END) AS "'', course, ''"'' ),'','' ) WITHIN GROUP(ORDER BY 1) AS concat_text FROM (SELECT DISTINCT course FROM grade);'; EXECUTE s_sql INTO rec;    s_sql := 'DROP VIEW IF EXISTS v_score; CREATE VIEW v_score AS SELECT name, ' || rec.concat_text || ' FROM grade GROUP BY name;';EXECUTE s_sql;
END $$;--调用
CALL fun_test();--查看执行结果
select * from v_score;

Tip:请注意SQL拼写时的英文单引号、双引号。

2、列转行示例

1)创建实验表(复用前面的测试数据)

--创建实验表(复用前面的测试数据)
CREATE TABLE grade1 AS 
SELECT name ,sum(case when course = '数学' then score else 0 end) AS "数学",sum(case when course = '英语' then score else 0 end) AS 英语,sum(case when course = '语文' then score else 0 end) AS 语文
FROM grade 
GROUP BY name;--查看结果
SELECT * FROM grade1;

2)使用union all,将各科目(数学、英语、语文)整合为一列

--使用union all,将各科目(数学、英语、语文)整合为一列
SELECT * FROM 
(
SELECT name, '数学' AS course, 数学 AS score FROM grade1
union all
SELECT name, '英语' AS course, 英语 AS score FROM grade1
union all
SELECT name, '语文' AS course, 语文  AS score FROM grade1
) 
order by name;

四、小结

行列互转在一些数据库使用场景中经常用到,比如数据分析、数仓建设等。但不同的数据库软件有着不同处理方式,但是行列换的基本思路是一致的。本文主要是以GaussDB数据为平台,为大家做了简单的讲述 ,欢迎测试。

——结束

相关文章:

GaussDB数据库SQL系列-行列转换

一、前言 二、简述 1、行转列概念 2、列转行概念 三、GaussDB数据库的行列转行实验示例 1、行转列示例 1)创建实验表(行存表) 2)静态行转列 3)行转列(结果值:拼接式) 4&…...

美国陆军网络司令部利用人工智能增强网络攻防和作战决策能力

源自: 奇安网情局 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨,并不意味着支持其观点或证实其内容的真实性。版权归原作者所有,如转载稿涉及版权等问题,请立即联系我们删除。 “人工智能技术与咨询…...

Notion团队协作魔法:如何玩转数字工作空间?

Notion简介 Notion已经成为现代团队协作的首选工具之一。它不仅仅是一个笔记应用,更是一个强大的团队协作平台,能够满足多种工作场景的需求。 Notion的核心功能 Notion提供了丰富的功能,如文档、数据库、看板、日历等,满足团队的…...

视频云存储/安防监控/AI视频智能分析平台新功能:人员倒地检测详解

人工智能技术已经越来越多地融入到视频监控领域中,近期我们也发布了基于AI智能视频云存储/安防监控视频智能分析平台的众多新功能,该平台内置多种AI算法,可对实时视频中的人脸、人体、物体等进行检测、跟踪与抓拍,支持口罩佩戴检测…...

解决RabbitMQ报错Stats in management UI are disabled on this node

文章目录 问题描述:解决步骤:进入容器后,cd到以下路径修改 management_agent.disable_metrics_collector false退出容器重启rabbitmq容器 问题描述: linux 部署 rabbitmq后,打开rabbitmq管理界面。点击channels&#…...

【重点】【NAND】聊聊固态硬盘SSD的寿命及其影响因素

固态硬盘是由主控芯片、存储颗粒芯片组成的闪存设备,固体硬盘的英文简称是SSD,如果是移动用的固态硬盘,则其英文简称为PSSD。 固态硬盘SSD分工业级和消费级等,目前,工业级固态硬盘SSD通常采用MLC闪存,而消…...

数据库约束

文章目录 1. 简介2. 代码演示3. 外键约束4. 外键删除和更新行为 1. 简介 概念:约束时作用于表中子段上的规则,用于限制存储在表中的shuju目的:保证数据库中数据的正确、有效性和完整性分类: 约束描述关键字非空约束限制该字段不…...

Unity实现MQTT服务器

首先下载MqttNet:MqttNet下载地址 解压好后使用vs打开,并生成.dll文件(我这里下载的是4.1.2.350版本) 然后再/Source/MQTTnet/bin/Debug/net452 文件夹中找到生成的文件 新建unity工程,创建Plugins文件夹&#xff0…...

Linux(centos) 下 Mysql 环境安装

linux 下进行环境安装相对比较简单,可还是会遇到各种奇奇怪怪的问题,我们来梳理一波 安装 mysql 我们会用到下地址: Mysql 官方文档的地址,可以参考,不要全部使用 https://dev.mysql.com/doc/refman/8.0/en/linux-i…...

决策树(Decision Tree)

决策树的定义: 分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)和有向边(directed edge)组成。结点有两种类型: 内部结点(internal node)和叶结点(leaf node&#xff0…...

解决 PaddleClas 下载预训练模型报错 ModuleNotFoundError No module named ‘ppcls‘ 的问题

当我们在使用 PaddleClas 进行预训练模型下载时,可能会遇到一个报错,报错信息为 ModuleNotFoundError: No module named ppcls。这个错误通常是因为 Python 解释器无法找到名为 ppcls 的模块,而我们的代码中正尝试导入它。让我们一起来解决这…...

视觉化洞察:为什么我们需要数据可视化?

为什么我们需要数据可视化?这个问题在信息时代变得愈发重要。数据,如今已成为生活的一部分,我们每天都在产生大量的数据,从社交媒体到购物记录,从健康数据到工作表现,数据无处不在。然而,数据本…...

C语言函数概述——拜佛代码

函数是一种可重用的代码块&#xff0c;用于执行特定任务或完成特定功能函数作用&#xff1a;对具备相同逻辑的代码进行封装&#xff0c;提高代码的编写效率&#xff0c;实现对代码的重用函数作用演示代码&#xff1a; #include <stdio.h>// 定义函数 void func() {print…...

防火墙日志分析工具

防火墙提供对进入组织网络的网络流量的来源和类型的可见性&#xff0c;这使得防火墙日志成为重要的信息源&#xff0c;包括所有连接的源地址、目标地址、协议和端口号等详细信息&#xff0c;此信息可以提供对未知安全威胁的见解&#xff0c;是威胁管理中的重要工具。 防火墙日…...

Autofac中多个类继承同一个接口,如何注入?与抽象工厂模式相结合

多个类继承同一个接口,如何注入&#xff1f;与抽象工厂模式相结合 需求: 原来是抽象工厂模式,多个类继承同一个接口。 现在需要使用Autofac进行选择性注入。 Autofac默认常识: Autofac中多个类继承同一个接口,默认是最后一个接口注入的类。 解决方案&#xff1a;(约定大于配…...

Django系列之日志配置

如何配置 settings.py 文件中增加如下日志模块 """logger 配置""" LOGGING {version: 1,disable_existing_loggers: False, # 是否去掉目前项目中其他地方中以及使用的日志功能&#xff0c;但是将来我们可能会引入第三方的模块&#xff0c;里…...

四轴飞行器传感器(SimulinkMatlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

学习 使用pandas库 DataFrame 使用

1 、 数据排序 sort_values()函数 by:要排序的名称或名称列表&#xff0c; sorted_df df.sort_values(byAge,ascendingFalse) 由大到小排序&#xff1b; sorted_df df.sort_values(byAge) 由小到大排序&#xff1b; # 创建一个示例数据帧 data {Name: [Tom, Nick, John…...

C++字符串详解

C 大大增强了对字符串的支持&#xff0c;除了可以使用C风格的字符串&#xff0c;还可以使用内置的 string 类。string 类处理起字符串来会方便很多&#xff0c;完全可以代替C语言中的字符数组或字符串指针。 string 是 C 中常用的一个类&#xff0c;它非常重要&#xff0c;我们…...

vant2 van-calendar组件增加清除按钮和确定按钮

利用自定义插槽增加一个清除按钮 <van-calendar ref"fTime1" select"selectTimePicker" confirm"changeTimePicker" :default-date"null" :show-confirm"false" v-model"timePickerShow" type"range&quo…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...