梧桐数据库的行转列

简介

梧桐数据库的两种行转列写法:

  1. group by + sum + case when
  2. group by + string_agg + split_part(分组,行转列,字符切割)

环境准备

--建表
CREATE TABLE public.sales ("year" int4 NOT NULL,quarter int4 NOT NULL,sales_amount numeric NULL
);--插入数据
INSERT INTO public.sales ("year", quarter, sales_amount) VALUES(2018, 1, 100);
INSERT INTO public.sales ("year", quarter, sales_amount) VALUES(2018, 2, 200);
INSERT INTO public.sales ("year", quarter, sales_amount) VALUES(2018, 3, 300);
INSERT INTO public.sales ("year", quarter, sales_amount) VALUES(2018, 4, 400);
INSERT INTO public.sales ("year", quarter, sales_amount) VALUES(2019, 1, 500);
INSERT INTO public.sales ("year", quarter, sales_amount) VALUES(2019, 2, 600);
INSERT INTO public.sales ("year", quarter, sales_amount) VALUES(2019, 3, 700);
INSERT INTO public.sales ("year", quarter, sales_amount) VALUES(2019, 4, 800);

我们想将每个季度的销售额作为一列,年份作为行,结果:

 year | q1  | q2  | q3  | q4
------+-----+-----+-----+-----2018 | 100 | 200 | 300 | 4002019 | 500 | 600 | 700 | 800
(2 rows)

方法1:使用group by + sum + case when

使用GROUP BY + SUM + CASE WHEN 也可以实现将行转列的效果。以下是一个示例:

SELECT  year,  SUM(CASE WHEN quarter = 1 THEN sales_amount ELSE 0 END) AS q1,  SUM(CASE WHEN quarter = 2 THEN sales_amount ELSE 0 END) AS q2,  SUM(CASE WHEN quarter = 3 THEN sales_amount ELSE 0 END) AS q3,  SUM(CASE WHEN quarter = 4 THEN sales_amount ELSE 0 END) AS q4  
FROM  sales  
GROUP BY  year  
ORDER BY  year;

在这个示例中,我们使用了四个不同的CASE WHEN表达式来计算每个季度的销售额。在每个CASE WHEN表达式中,我们检查季度是否等于1、2、3或4,如果是,就将对应的销售额加入到该季度的总计中。否则,我们将0加入到总计中。

在查询中,我们使用GROUP BY子句对年份进行分组,并对每个季度的销售额进行求和。结果与使用crosstab函数得到的结果相同。

方法2:使用group by + string_agg + split_part(分组,行转列,字符切割)

使用GROUP BY + string_agg + split_part 也可以实现将行转列的效果。以下是一个示例:

SELECT  year,  split_part(sales_agg, ',', 1)::numeric AS q1,  split_part(sales_agg, ',', 2)::numeric AS q2,  split_part(sales_agg, ',', 3)::numeric AS q3,  split_part(sales_agg, ',', 4)::numeric AS q4  
FROM (  SELECT  year,  string_agg(sales_amount::text, ',' ORDER BY quarter) AS sales_agg  FROM sales  GROUP BY year  
) AS sales_pivot;

在这个示例中,我们使用string_agg函数将每个季度的销售额连接成一个以逗号分隔的字符串(这里一定需要加上order by子句)。然后,我们使用split_part函数将字符串拆分成四个部分,以获取每个季度的销售额,并将其转换为数字类型。最后,我们在外部查询中指定了每个季度的数据类型和名称。

在查询中,我们首先使用GROUP BY子句对年份进行分组,并使用string_agg函数将每个季度的销售额连接成一个以逗号分隔的字符串。然后,我们在外部查询中使用split_part函数将字符串拆分成四个部分,并将其转换为数字类型,以获取每个季度的销售额。结果与使用crosstab函数或GROUP BY + SUM + CASE WHEN得到的结果相同。

其他数据库比较

Oracle和Mysql可以使用通用的条件聚合而不是尝试拆分字符串

SELECT  year,  SUM(CASE WHEN quarter = 1 THEN sales_amount ELSE 0 END) AS q1,  SUM(CASE WHEN quarter = 2 THEN sales_amount ELSE 0 END) AS q2,  SUM(CASE WHEN quarter = 3 THEN sales_amount ELSE 0 END) AS q3,  SUM(CASE WHEN quarter = 4 THEN sales_amount ELSE 0 END) AS q4  
FROM  sales  
GROUP BY  year  
ORDER BY  year;

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

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

相关文章

CTF(四)

导言: 本文主要讲述在CTF竞赛中,web类题目file_include。 靶场链接:攻防世界 (xctf.org.cn) 一,观察页面。 可以看到一段php代码。从则段代码中我们可以知道: 1,使用include引入check.php文件&#xff…

排序算法 —— 快速排序(理论+代码)

目录 1.快速排序的思想 2.快速排序的实现 hoare版 挖坑法 前后指针法 快排代码汇总 3.快速排序的优化 三数取中 小区间优化 三路划分 4.快速排序的非递归版本 5.快速排序总结 1.快速排序的思想 快速排序是一种类似于二叉树结构的排序方法。其基本思想为从待排序序…

【前端】如何制作一个自己的网页(15)

有关后代选择器的具体解释&#xff1a; 后代选择器 后代选择器使用时&#xff0c;需要以空格将多个选择器间隔开。 比如&#xff0c;这里p span&#xff0c;表示只设置p元素内&#xff0c;span元素的样式。 <style> /* 使用后代选择器设置样式 */ p span { …

给EXE添加网络验证激活码(卡密)

介绍 网络验证可以理解为给EXE文件添加一个激活码, 用户在打开EXE文件时, 需要输入激活码, 输入后, 通过网络验证激活码, 如果激活码有效用户便可以继续使用软件. 网络验证可以生成静态激活码(也就是卡密), 再需要使用的时候直接发给用户即可, 无需像离线一机一码加密那样需要…

漏洞挖掘 | 基于mssql数据库的sql注入

前记 今天挖edu随意点开个站&#xff0c;发现存在mssql数据库的sql注入&#xff0c;在此分享下整个挖掘过程 目录 0x1 判断网站数据库类型 0x2 了解mssql数据库的主要三大系统表 0x3 了解mssql的主要函数 0x4 判断注入点及其注入类型 0x5 联合查询之判断列数 0x6 联合查询之…

spring源码拓展点3之addBeanPostProcesser

概述 在refresh方法中的prepareBeanFactory方法中&#xff0c;有一个拓展点&#xff1a;addBeanPostProcessor。即通过注入Aware对象从而将容器中的某些值设置到某个bean中。 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));aware接口调用 …

华为配置 之 Console线路配置

目录 简介&#xff1a; 知识点&#xff1a; 配置Console线路密码 1.密码认证模式 2.AAA认证模式 知识点&#xff1a; 总结&#xff1a; 简介&#xff1a; 使用PC模拟器与路由器相连&#xff08;与交换机相连原理一样&#xff09;&#xff0c;在关机状态下&#xff0c;使用…

手机玩黑色沙漠?GameViewer远程玩黑色沙漠教程

黑色沙漠的国服即将在10月24日迎来公测&#xff01;这是一款玩法多元的大型多人在线角色扮演游戏&#xff0c;你可以享受激烈的战斗&#xff0c;也可以感受惬意的生活&#xff0c;在这个游戏里你能体验到一个不一样的冒险故事。不管你是老玩家还是新玩家&#xff0c;只要你想玩…

鸿蒙开发:实现一个超简单的网格拖拽

前言 网格拖拽&#xff0c;此功能很是常见&#xff0c;一般用于频道的编辑或者条目顺序的排列&#xff0c;在鸿蒙的开发中&#xff0c;针对网格的编辑&#xff0c;系统也给出了相关的Api&#xff0c;通过onItemDragStart和在onItemDrop即可轻松实现&#xff0c;onItemDragStart…

Linux LVS详解

LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器&#xff0c;是一个基于Linux操作系统的高性能、可扩展的负载均衡器。以下是对LVS的详细介绍&#xff1a; 一、简介 LVS项目由章文嵩博士在1998年5月发起&#xff0c;是中国国内最早出现的自由软件项目之一…

Flutter Container容器组件实战案例

The Container widget is your design toolkit. It’s like the master builder that helps you structure and style your UI elements with precision. Whether you’re creating simple designs or complex layouts, the Container is your trusty tool for the job. “容器…

如何在算家云搭建GPT-SOVITS(语音转换)

一、模型介绍 GPT-SOVITS是一款强大的小样本语音转换和文本转语音 WebUI工具。它集成了声音伴奏分离、自动训练集分割、中文ASR和文本标注等辅助工具。 具有以下特征&#xff1a; 零样本 TTS&#xff1a; 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS&…

ESC服务器被暴力破解如何解决

使用fail2ban解决 黑客怎么暴力破解的?安装教程一些命令 黑客怎么暴力破解的? 他们一般是用脚本扫描公网上的ip地址, 一个个ping, 如果ping通了, 就开始以这个公网ip尝试连接服务器, 比如使用ssh, 接下来就输入密码了, 暴力破解他们一般都有密码表的, 一个个试, 密码简单很容…

【赵渝强老师】Oracle的参数文件与告警日志文件

一、Oracle的参数文件 在Oracle数据库中&#xff0c;参数文件在通常情况下指的就是初始化参数文件&#xff08;Initialization Parameter File)。在参数文件中包括了初始化参数文件和服务器端参数文件。在Oracle数据库启动的时候就会读取参数文件&#xff0c;然后根据参数文件…

C++ 进阶:类相关特性的深入探讨

⭐在对C 中类的6个默认成员函数有了初步了解之后&#xff0c;现在我们进行对类相关特性的深入探讨&#xff01; &#x1f525;&#x1f525;&#x1f525;【C】类的默认成员函数&#xff1a;深入剖析与应用&#xff08;上&#xff09; 【C】类的默认成员函数&#xff1a;深入剖…

python实战项目46:selenium爬取百度新闻

python实战项目46:selenium爬取百度新闻 一、项目简介二、完整代码一、项目简介 思路是首先使用selenium打开百度新闻页面,然后实现翻页操作,获取每条新闻的标题和链接。接下来的问题是,在遍历标题和链接,对每一个链接发送请求时,发现会弹出百度安全验证,本文的思路是使…

浪潮云启操作系统(InLinux)bcache缓存实践:理解OpenStack环境下虚拟机卷、Ceph OSD、bcache设备之间的映射关系

前言 在OpenStack平台上&#xff0c;采用bcache加速ceph分布式存储的方案被广泛用于企业和云环境。一方面&#xff0c;Ceph作为分布式存储系统&#xff0c;与虚拟机存储卷紧密结合&#xff0c;可以提供高可用和高性能的存储服务。另一方面&#xff0c;bcache作为混合存储方案&…

新版idea菜单栏展开与合并

新版idea把菜单栏合并了看着很是不习惯&#xff0c;找了半天原来在这里展开 ① 点击文件 -> 设置 ② 点击外观与行为 -> 外观 -> 合并主菜单和窗口标题 然后确定&#xff0c;重启即可

HTML作业

作业 复现下面的图片 复现结果 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><form action"#"method"get"enctype"text/plain"><…

演示:基于WPF的DrawingVisual开发的高刷新率示波器

一、目的&#xff1a;分享一个基于WPF的DrawingVisual开发的高刷新率示波器 二、效果演示 特此说明&#xff1a;由于Gif录制工具帧率不够&#xff0c;渲染60帧用了4.6秒&#xff0c;平均帧率在12Hz左右&#xff0c;所以展示效果不好&#xff0c;想要看好些的效果可以看文章下面…