sql 分组 行列转换
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_Id | OrderDate | OrderPrice | Customer |
---|---|---|---|
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
现在,我们希望查找每个客户的总金额(总订单):
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
Customer | SUM(OrderPrice) |
---|---|
Bush | 2000 |
Carter | 1700 |
Adams | 2000 |
2、Sql的行列转换 - 纵横表
参考Sql的行列(纵横表)转换
关于纵表和横表的相互转换问题,主要是考虑表的设计以及业务的需求。
1)纵表转横表
假设我有一张纵表
姓名 | 课程 | 分数 |
---|---|---|
张三 | 语文 | 98 |
张三 | 数学 | 89 |
张三 | 物理 | 78 |
李四 | 语文 | 79 |
李四 | 数学 | 88 |
李四 | 物理 | 100 |
我们要转成的横表是这样子的:
姓名 | 语文 | 数学 | 物理 |
---|---|---|---|
张三 | 98 | 89 | 78 |
李四 | 79 | 88 | 100 |
既然这个表只有两列,那么可以根据姓名进行分组。先把姓名拼凑出来,后面的分数我们再想办法。
select 姓名 from scores group by 姓名
分析:
我们先拿到语文这个科目的分数。既然我们用到了group by 语句,这里肯定要用聚合函数来求分数。
而且我们只需要语文这一科的成绩,分组出来的 一共有 3列 ,分别是语文、数学、物理 。 那么就需要判断科目来取分数。
这里符合我们需求的 case 语句就登场了。它和c#中switch-case 作用一样。
case 字段when 值1 then 结果when 值2 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_mode
为strict
下并不支持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
sql 分组 行列转换相关推荐
- SQL语句行列转换两种方法 case ...when 和pivot函数应用
2019独角兽企业重金招聘Python工程师标准>>> SQL语句行列转换两种方法 case ...when 和pivot函数应用SQL语句行列转换两种方法 case ...when ...
- SQL Server 行列转换(1)
参考前一个SQL的行列转换例子http://www.cnblogs.com/insus/articles/1969896.html ,觉得不够自由,需要去预先知道记录的内容去定义行或列. 下面这个方法 ...
- 一些sql 语句(行列转换等)
1. 行列转换--普通 假设有张学生成绩表(CJ)如下 Name Subject Result 张三 语文 80 张三 数学 90 张三 物理 85 李四 语文 85 李四 数学 92 李四 物理 8 ...
- [转载]SQL Server行列转换实现
一.Pivot和UnPivot介绍 1.Pivot介绍 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVO ...
- SQL Server 行列转换(2)
参考前一个例子http://www.cnblogs.com/insus/articles/1969896.html,现想使用另外一种方式来处理行列转换,实现下面效果: 参考代码: View Code ...
- PL/SQL 实现行列转换
这篇博文写的是简单的行列转换的,以一个具体的例子来给出. 以前在论坛上有人问过相关的问题,上面的回答五光十色,有很多是可行的,当然更多的是自以为很高端,实际却不着边际的回答.下面进入正题. part1 ...
- mysql行列转换case_浅析SQL语句行列转换的两种方法 case...when与pivot函数的应用_MySQL...
bitsCN.com /*创建数据库*/ CREATE DATABASE tmp go USE tmp go /*创建数据库测试表*/ CREATE TABLE [Scores] ( [ID] INT ...
- mysql pivot函数怎么用_浅析SQL语句行列转换的两种方法 case...when与pivot函数的应用...
/*创建数据库*/ CREATE DATABASE tmp go USE tmp go /*创建数据库测试表*/ CREATE TABLE [Scores] ( [ID] INT IDENTITY(1 ...
- SQL SERVER 行列转换(1)——聚合函数静态转换
在实际开发中,有时候需要对数据表进行行列转换,转换之后再显示对应的数据,行列转换的方法比较多,本次介绍静态的利用聚合函数来实现,行转列测试数据: --测试数据 if not object_id(N'T ...
- Sql server 行列转换 PIVOT UNPIVOT
官方介绍链接 下面是SQL示例 drop table tb create table tb(name varchar(10),course varchar(10),score int,sex char ...
最新文章
- c#_Func和Action委托简介
- CString类的用法总结
- Mabatis 源码探究(2)Java 获取mybatis-config.xml的输入流 inputStream对象
- 炫酷!用Python制作漂亮的流动桑基图
- 7个管理和优化网站资源的 Python 工具
- 7.0上的新KIE持久性API
- c语言循环结构菱形九九乘法表,C语言基础用基本的循环语句打印实心和空心菱形、九九乘法表 ....
- 哪一类功率放大电路效率最高_集成电路工艺之双极型工艺
- 网络克隆硬件版硬盘保护卡 支持windows7 和linux,方正还原卡的详细介绍,安装,和卸载。...
- 024_spacemacs支持org-pomodoro的声音提示
- 管理Linkedin账号三步曲,高效管理领英账号。
- 信通院郭雪:软件供应链安全标准体系建设与洞察
- picker 监听确定和取消事件
- 【linux kernel】基于ARM64分析linux内核的链接脚本vmlinux.lds.S
- java制作SM2证书
- cout和std::cout的区别
- 合泰单片机做电压表_合泰单片机使用总结
- Refused to load the image 'URL' because it violates the following content security polity diretive
- 网络计算机怎么使用,联想电脑如何进入和使用网络同传功能
- C语言把字符转换为整数的方法和示例