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_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

sql 分组 行列转换相关推荐

  1. SQL语句行列转换两种方法 case ...when 和pivot函数应用

    2019独角兽企业重金招聘Python工程师标准>>> SQL语句行列转换两种方法 case ...when 和pivot函数应用SQL语句行列转换两种方法 case ...when ...

  2. SQL Server 行列转换(1)

    参考前一个SQL的行列转换例子http://www.cnblogs.com/insus/articles/1969896.html ,觉得不够自由,需要去预先知道记录的内容去定义行或列. 下面这个方法 ...

  3. 一些sql 语句(行列转换等)

    1. 行列转换--普通 假设有张学生成绩表(CJ)如下 Name Subject Result 张三 语文 80 张三 数学 90 张三 物理 85 李四 语文 85 李四 数学 92 李四 物理 8 ...

  4. [转载]SQL Server行列转换实现

    一.Pivot和UnPivot介绍 1.Pivot介绍 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVO ...

  5. SQL Server 行列转换(2)

    参考前一个例子http://www.cnblogs.com/insus/articles/1969896.html,现想使用另外一种方式来处理行列转换,实现下面效果: 参考代码: View Code ...

  6. PL/SQL 实现行列转换

    这篇博文写的是简单的行列转换的,以一个具体的例子来给出. 以前在论坛上有人问过相关的问题,上面的回答五光十色,有很多是可行的,当然更多的是自以为很高端,实际却不着边际的回答.下面进入正题. part1 ...

  7. mysql行列转换case_浅析SQL语句行列转换的两种方法 case...when与pivot函数的应用_MySQL...

    bitsCN.com /*创建数据库*/ CREATE DATABASE tmp go USE tmp go /*创建数据库测试表*/ CREATE TABLE [Scores] ( [ID] INT ...

  8. mysql pivot函数怎么用_浅析SQL语句行列转换的两种方法 case...when与pivot函数的应用...

    /*创建数据库*/ CREATE DATABASE tmp go USE tmp go /*创建数据库测试表*/ CREATE TABLE [Scores] ( [ID] INT IDENTITY(1 ...

  9. SQL SERVER 行列转换(1)——聚合函数静态转换

    在实际开发中,有时候需要对数据表进行行列转换,转换之后再显示对应的数据,行列转换的方法比较多,本次介绍静态的利用聚合函数来实现,行转列测试数据: --测试数据 if not object_id(N'T ...

  10. Sql server 行列转换 PIVOT UNPIVOT

    官方介绍链接 下面是SQL示例 drop table tb create table tb(name varchar(10),course varchar(10),score int,sex char ...

最新文章

  1. c#_Func和Action委托简介
  2. CString类的用法总结
  3. Mabatis 源码探究(2)Java 获取mybatis-config.xml的输入流 inputStream对象
  4. 炫酷!用Python制作漂亮的流动桑基图
  5. 7个管理和优化网站资源的 Python 工具
  6. 7.0上的新KIE持久性API
  7. c语言循环结构菱形九九乘法表,C语言基础用基本的循环语句打印实心和空心菱形、九九乘法表 ....
  8. 哪一类功率放大电路效率最高_集成电路工艺之双极型工艺
  9. 网络克隆硬件版硬盘保护卡 支持windows7 和linux,方正还原卡的详细介绍,安装,和卸载。...
  10. 024_spacemacs支持org-pomodoro的声音提示
  11. 管理Linkedin账号三步曲,高效管理领英账号。
  12. 信通院郭雪:软件供应链安全标准体系建设与洞察
  13. picker 监听确定和取消事件
  14. 【linux kernel】基于ARM64分析linux内核的链接脚本vmlinux.lds.S
  15. java制作SM2证书
  16. cout和std::cout的区别
  17. 合泰单片机做电压表_合泰单片机使用总结
  18. Refused to load the image 'URL' because it violates the following content security polity diretive
  19. 网络计算机怎么使用,联想电脑如何进入和使用网络同传功能
  20. C语言把字符转换为整数的方法和示例

热门文章

  1. 淘宝天猫店铺装修问题与技巧性经验汇总
  2. CSS font-family 属性值大全
  3. Baxter学习笔记
  4. 企业大数据规划建设方案(PPT)
  5. 【2020】微软 MCSA,MCSD,MCSE认证于2021年1月31停用,此后您将无法再获得此认证 - GJYJSJGS - 高级云计算架构师
  6. Redis 操作命令大全
  7. kali linux权限维持,msfconsole权限维持
  8. 初中参观机器人博物馆的作文_参观机器人博物馆作文
  9. 什么是JSONP及其实现原理
  10. aide, libgdx写一个爱心小游戏