sql 分组 行列转换

article/2025/10/17 6:05:42

sql 分组 & 行列转换

文章目录

    • sql 分组 & 行列转换
        • 1、groupby(配合组合函数使用)
        • 2、Sql的行列转换 - 纵横表
          • 1)纵表转横表
          • 2)横表转纵表

sql语句教程参考W3C School - SQL 教程 就够了

1、groupby(配合组合函数使用)

参考 groupby分组和Count, Sum()

合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句,根据一个或多个列对结果集进行分组

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name

举个栗子,原表如下:

O_IdOrderDateOrderPriceCustomer
12008/12/291000Bush
22008/11/231600Carter
32008/10/05700Bush
42008/09/28300Bush
52008/08/062000Adams
62008/07/21100Carter

现在,我们希望查找每个客户的总金额(总订单):

SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
CustomerSUM(OrderPrice)
Bush2000
Carter1700
Adams2000

2、Sql的行列转换 - 纵横表

参考Sql的行列(纵横表)转换

关于纵表和横表的相互转换问题,主要是考虑表的设计以及业务的需求

1)纵表转横表

假设我有一张纵表

姓名课程分数
张三语文98
张三数学89
张三物理78
李四语文79
李四数学88
李四物理100

我们要转成的横表是这样子的:

姓名语文数学物理
张三988978
李四7988100

既然这个表只有两列,那么可以根据姓名进行分组。先把姓名拼凑出来,后面的分数我们再想办法。

select 姓名 from scores group by 姓名 

分析:

  • 我们先拿到语文这个科目的分数。既然我们用到了group by 语句,这里肯定要用聚合函数来求分数。

  • 而且我们只需要语文这一科的成绩,分组出来的 一共有 3列 ,分别是语文、数学、物理 。 那么就需要判断科目来取分数

这里符合我们需求的 case 语句就登场了。它和c#中switch-case 作用一样。

case 字段when1 then 结果when2 then 结果2...else 默认结果
end
select 姓名,SUM(case 课程 when  '语文' then 分数 else 0 end) as 语文 from scores group by 姓名 

查询到的表为:

姓名语文
张三98
李四79

完整sql语句为:

select 姓名,SUM(case 课程 when  '语文' then 分数 else 0 end) as 语文,SUM(case 课程 when  '数学' then 分数 else 0 end) as 数学,SUM(case 课程 when  '物理' then 分数 else 0 end) as 物理
from scores group by 姓名 
2)横表转纵表

我们先把刚刚转好的表,插入一个新表Scores2中。

select 姓名,SUM(case 课程 when  '语文' then 分数 else 0 end) as 语文,SUM(case 课程 when  '数学' then 分数 else 0 end) as 数学,SUM(case 课程 when  '物理' then 分数 else 0 end) as 物理into scores2
from scores group by 姓名

上面这条select into语句会报错:> 1327 - Undeclared variable: scores2

参考https://stackoverflow.com/questions/2949653/select-into-and-undeclared-variable-error

Notes:

1)先创建scores2横表,再修改成Insert into select即可(保持要插入的数据元组和scores字段个数一致可以成功插入)

2)select into语句被Insert into select取代,参考insert into select语句的使用 & 常见问题

3)Insert into select语句在sql_modestrict下并不支持select的关联查询的插入操作

INSERT into scores2
select NAME,SUM(case course when  '语文' then score else 0 end) as 语文,SUM(case course when  '数学' then score else 0 end) as 数学,SUM(case course when  '物理' then score else 0 end) as 物理
from scores group by NAME

得到该表

在这里插入图片描述

select 姓名,'语文' as 课程,语文 as 分数from scores2 

在这里插入图片描述

还有两科的数据怎么办呢? 很简单,我们一个个都查出来,然后用 union all 把他们组合为一张表就可以了。

整体sql语句

SELECT `姓名`, '语文' as '课程',语文 as 分数 
from scores2
UNION
SELECT `姓名`, '数学' as '课程',数学 as 分数 
from scores2
UNION
SELECT `姓名`, '物理' as '课程',物理 as 分数 
from scores2
ORDER BY `姓名` desc

http://chatgpt.dhexx.cn/article/DZh1bbr6.shtml

相关文章

SQL:分组数据

分组数据: A. SQL Server Group By语句 Group By 从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集” 划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。 以下是 GROUP BY 子句的语…

SQL语言中的分组数据

(1)group by子句 group by 根据by指定的规则对数据进行分组。 分组:即将一个“数据集”划分成若干个“小区域”,再对若干个“小区域”进行数据处理。 语法: group by 子句为列中的每个值组合生成一个组。 group by子…

SQL分组指南

目录 什么是SQL分组? SQL GROUP BY和Sum 排序分组结果 HAVING和GROUP BY 包含多个表的GROUP BY 按SUM()排序 带有表达式的GROUP BY SQL GROUP BY与DISTINCT 结论 什么是SQL分组? 在SQL中,分组是唯一的列值组合。当查询具有GROUP BY…

单例模式的使用和应用场景

1.概念 标题单例模式:单例指的是单实例,一个类中有且仅有创建一个实例 单例模式的应用场景:windows的任务管理器(不可打开两次吧)、回收站等 单例模式应用一般发现在以下条件下: servlet单例、struts2多例、springmvc单例 &…

单例模式实战应用

理论 什么是单例模式 保证整个系统中一个类只有一个对象的实例,实现这种功能的方式就叫单例模式 常用的 service 和 dao 层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如 action spring 中的 bean 和 spring mvc 中…

单例模式php应用场景,php单例模式 使用场景和使用方法

一个类只有一个对象实例 1、含义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。 2、单例模式的三个要点&#xff1a…

Java设计模式及应用场景之《单例模式》

文章目录 一、单例模式定义二、单例模式的结构和说明三、懒汉式和饿汉式的实现1、懒汉式2、饿汉式 四、懒汉式和饿汉式的优缺点五、双重检查加锁方式的实现六、类级内部类方式的实现七、枚举方式的实现 (最佳方式)八、单例模式的应用场景 一、单例模式定义 保证一个类只能有一个…

一文带你了解 Java 五种单例模式的实现方式以及应用场景

单例模式 什么是单例模式 类的单例设计模式,就是采取一定的方法保证在整个软件系统中,某个类只能存在一个对象实例,并且这个类会提供一个获取对象实例的方法。 思路:如果让一个类在一个虚拟机里面只能产生一个对象,就…

js设计模式之 单例模式与应用场景

1.介绍 单例模式(Singleton Pattern)是设计模式中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个…

单例模式的理解?单例模式如何实现?单例模式应用场景

说说你对单例模式的理解?如何实现? 一、是什么 单例模式(Singleton Pattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象&…

设计模式之单例模式应用场景篇

应用场景 我们为什么要使用单例模式呢?它有什么好处? (一)单例模式可以让我们只创建一个对象从而避免了频繁创建对象导致的内存消耗和垃圾回收。 Servlet是单例模式,我们只需要创建一个Servlet,然后接收请求…

关于getText()的小问题

由一个作业开始的,整完广度优先小作业的时候开始是在代码中指定值进行寻找路径,后面想想还是弄两文本框输入起点和终点更灵活一点好了。谁知道这个JTextField真的让我崩溃了 怎么说应该是我对Java的基础知识没有进行深入了解吧,好吧,我是在今天才知道getText()是在监听事件…

js gettext

test.php 1 <?php2 $localezh_CN;3 if(isSet($_GET["locale"]))$locale $_GET["locale"];4 ?>5 <html>6 <head>7 <link rel"gettext" type"application/x-po" href"./locale/<?php echo $locale ?&…

关于Java getText()方法的问题

这是一个登陆界面的鼠标事件&#xff0c;获取文本区t61的内容&#xff0c;与用户姓名比对&#xff0c;同时验证登陆密码&#xff0c;但是用户姓名比对一直不成功&#xff0c;导致鼠标事件不能反映&#xff0c;页面不能跳转&#xff0c;想知道为什么&#xff0c;求大佬指点。 p…

java的gettext_JAVA里 getText() 是什么意思,怎么用?

展开全部 JAVA里 getText() 的意思是&#xff1a;返回数据窗口控件中 悬浮在当前行列之上的32313133353236313431303231363533e4b893e5b19e31333431366266编辑框中的文本。 在用户修改数据窗口中某项的值时&#xff0c;实际上首先在悬浮 在当前项上的编辑框中进行修改&#xff…

python gettext的使用方法

app.py 里面的print函数输出内容&#xff0c;是会更据你选择的语言平台而改变 将app.py生成.po文件(或者生成.pot文件)&#xff0c;如果是.pot文件需要重命名为.po pygettext.py安装python的时候就自己带着有&#xff0c;去你的安装路径找 python &#xff08;这一步&#xff…

getText()和getText().toString()

在deadline只有一根咪咪的距离时&#xff0c;我就直接吐槽了。 一个组件&#xff0c;比方说EditView&#xff0c;它的getText()和getText().toString()这两种想得到这个组件中的内容的方法是不一样的&#xff0c;我在用startActivityForResulr()之后接收到来自另一个activity的…

登陆QQ时总显示QQ安全防护进程,而且点了确定后QQ还是登不上

解决办法&#xff1a;把服务QPcore启动&#xff0c;或者删除掉防护进程&#xff08;QPcore&#xff09;

启动电脑QQ遇到QQ安全防护进程,且Windows无法启动QPCore Server

解决方法 1.winR 输入msconfig, “启动”->打开任务管理器 2.最右面的"服务" 3.下面"打开服务" 4.找到Windows update,双击,在"启动类型"选择"自动"→“应用”→“确定” 5.找到QPCore service,双击,在"启动类型"选择&q…