原文来自:http://blog.csdn.net/Eastmount/article/details/50559008

本文主要讲述了SQL查询语句表之间的行列转换,同时也包括如何将一行数据转换成两列数据的方法、子查询的应用、decode函数的用法。希望文章对你有所帮助~

  • 1.创建数据库表及插入数据
  • 2.子查询统计不同性质的学生总数
  • 3.一行数据转换成两列数据 union all
  • 4.表行列数据转换(表转置)


1.创建数据库表及插入数据

创建数据库、创建学生表并设置主键、插入数据代码如下:

  1. --创建数据库
  2. create database StudentMS
  3. --使用数据库
  4. use StudentMS
  5. --创建学生表 (属性:姓名、学号(pk)、学院、出生日期、性别、籍贯)
  6. create table xs
  7. (
  8. name varchar(10) not null,
  9. id varchar(10) not null,
  10. xy varchar(10),
  11. birthday datetime,
  12. xb char(2),
  13. jg varchar(8)
  14. )
  15. --创建学生表主键:学号
  16. alter table xs
  17. add constraint
  18. pk_xs primary key(id)
  19. --插入数据
  20. insert into xs
  21. (id, name, xb, birthday, xy, jg)
  22. values('1160001', '刘备', '男', '1991-11-5', '软件学院', '河北省');

输出数据如下图所示:

2.子查询统计不同性质的学生总数

使用子查询统计不同学院总人数、不同性别总人数和河北/河南学生总人数。

  1. --子查询统计人数
  2. select a.a_num as 软院人数, b.b_num as 计院人数, c.c_num as 自动化人数,
  3. d.d_num as 男生人数, e.e_num as 女生人数, f.f_num as 河北河南人数
  4. from
  5. (select count(*) as a_num from xs where xy='软件学院') a,
  6. (select count(*) as b_num from xs where xy='计算机学院') b,
  7. (select count(*) as c_num from xs where xy='自动化学院') c,
  8. (select count(*) as d_num from xs where xb='男') d,
  9. (select count(*) as e_num from xs where xb='女') e,
  10. (select count(*) as f_num from xs where jg in ('河北省','河南省')) f;

输出结果:

PS:若中文汉字太长报错,则需引用双引号。如:select num as "项目(文化学术讲座)"

3.一行数据转换成两列数据

这时,项目SQL语句的需要是显示成两列如下图所示:

其实简单编写SQL语句,前端再处理这些数据更加方便,当然SQL也是能处理的。
当时走进了一个误区,认为"软件人数"是select中as自定义的一行数据的属性,如何显示在表中呢?当时是通过Oracle方法decode自定义显示的,其实直接输出,union all取代子查询即可。当然union all其它表也可以继续添加。

  1. select '软院人数' as "统计类别", count(*) as "数量" from xs where xy='软件学院'
  2. union all
  3. select '计院人数', count(*) from xs where xy='计算机学院'
  4. union all
  5. select '自动化人数', count(*) from xs where xy='自动化学院'
  6. union all
  7. select '男生人数', count(*) from xs where xb='男'
  8. union all
  9. select '女生人数', count(*) from xs where xb='女'
  10. union all
  11. select '河北河南人数', count(*) from xs where jg in ('河北省','河南省');

这里我简单给大家回顾下UNION ALL方法:(参考:MIN飞翔博客)
UNION:
        (1) 其目的是将两个SQL语句的结果合并起来;
        (2) 它的一个限制是两个SQL语句所产生的栏位需要是同样的资料种类;
        (3) UNION只是将两个结果联结起来一起显示,并不是联结两个表;
        (4) UNION在进行表链接后会筛选掉重复的记录。

UNION ALL:
        (1) 这个指令的目的也是要将两个 SQL 语句的结果合并在一起;
        (2) UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一个符合条件的资料都列出来,无论资料值有无重复;
        (3) UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

从效率上说,sql union all的执行效率要比sql union效率要高很多,这是因为使用sql union需要进行排重,而sql union All 是不需要排重的,这一点非常重要,因为对于一些单纯地使用分表来提高效率的查询,完全可以使用sql union All。

补充:(摒弃的代码)
当时使用decode函数,如果KWHD_WH_XZ='校级',则输出自定义值'校级总数',否则输出原始值;同时通过group by获取该列所有值,sum(decode(t.KWHD_WH_XZ,'校级',1,0)计算校级的个数。

  1. select whxs1.num1 as 项目名称,  whxs2.num2 as 数量
  2. from
  3. (select decode(KWHD_WH_XZ, '校级', '校级总数', KWHD_WH_XZ) as num1
  4. from T_WSTB_KWHD_1 t
  5. where KWHD_WH_XZ='校级'
  6. group by KWHD_WH_XZ) whxs1,
  7. (select sum(decode(t.KWHD_WH_XZ,'校级',1,0)) as num2
  8. from T_WSTB_KWHD_1 t
  9. where KWHD_WH_XZ='校级'
  10. group by KWHD_WH_XZ ) whxs2;

输出如下,但是再添加一行数据如何实现呢?所以还是推荐UNION ALL。

4.表行列数据转换(表转置)

参考:http://blog.163.com/dreamman_yx/blog/static/26526894201121595846270

SQL语句如下:

  1. select country, sum(case when type='A' then money end) as A,
  2. sum(case when type='B' then money end) as B,
  3. sum(case when type='C' then money end) as C
  4. from table1
  5. group by country

另一种方法源自文章:http://blog.sina.com.cn/s/blog_63772d910100pmln.html
方法介绍:

  1. decode(条件,值1,结果1,值2,结果2,值3,结果3,... 值n,结果n,缺省值)
  2. 函数类比:
  3. IF 条件=值1 THEN
  4.     RETURN(结果1)
  5. ELSIF 条件=值2 THEN
  6.     RETURN(结果2)
  7.     ......
  8. ELSIF 条件=值n THEN
  9.     RETURN(结果n)
  10. ELSE
  11.     RETURN(缺省值)
  12. END IF

举个例子如下:

SQL语句如下,其中sum(decode(t.result,'胜',1,0))表示result字段如果值为“胜”,则decode的结果值为1,否则取缺省值0,最后sum统计加和。

  1. select  
  2. name as 姓名,sum(decode(t.result,'胜',1,0)) as 胜,sum(decode(t.result,'负',1,0)) as 负  
  3. from t_result t  
  4. group by name  
  5. order by 胜 desc,负 asc  

最后希望文章对你有所帮助,其实SQL语句中还是有很多非常高深的变化,目前只窥得一二啊!fighting...O(∩_∩)O
(By:Eastmount 2016-01-22 深夜5点   http://blog.csdn.net//eastmount/ )

[数据库] SQL查询语句表行列转换及一行数据转换成两列的更多相关文章

  1. WordPress 常用数据库SQL查询语句大全

    在使用WordPress的过程中,我们少不了要对数据库进行修改操作,比如,更换域名.修改附件目录.批量修改文章内容等等.这个时候,使用SQL查询语句可以大大简化我们的工作量. 关于如何操作SQL查询语 ...

  2. 从数据库中查询所有表及所有字段的SQL语句

    从数据库中查询所有表及所有字段的SQL语句 由于一个小项目的需要,近日完成一个从数据库中查询所有表及所有字段的方法,其实用两条SQL语句就可以完成. Sql Server版:列出当前DB中所有表:se ...

  3. MySQL数据库详解(一)执行SQL查询语句时,其底层到底经历了什么?

    一条SQL查询语句是如何执行的? 前言 ​ 大家好,我是WZY,今天我们学习下MySQL的基础框架,看一件事千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于MyS ...

  4. Hibernate原生SQL查询多表关联,SQL语句要注意的问题

    Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...

  5. 转: 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

  6. 数据库SQL的多表查询

    数据库 SQL 的多表查询:eg: table1: employees, table2: departments,table3: salary_grades; 一:内连接: 1):等值连接: 把表em ...

  7. 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

  8. PowerDesigner创建表 拷贝创建表语句 SQLSERVER创建数据库 使用查询 创建表 并且添加数据

    PowerDesigner创建表 : 1.双击打开PowerDesigner   2.双击打开Create model 3左键点击Model  types,再点击Physical    Data  m ...

  9. oracle执行sql查询语句出现错误ORA-00942:表或视图不存在

    情况是这样,A库的用户名和表空间分别为SH , SH 把业务表SH所有数据从A库,导入到B库, 表空间为SH,用户名为SP 在B库里面执行sql查询语句出现错误ORA-00942:表或视图不存在 语句 ...

随机推荐

  1. office------------word邮件合并(word2016版)

    虽然本人是学计算机的,但是office技能很一般,最近工作中用到了邮件合并这一功能,记录下来与大家分享. 我用到的邮件合并就是word中定好模板,从excel中批量导入数据,现实生活中,在录取通知书打 ...

  2. 清北学堂 NOIP2017模拟赛 越赛越心塞

    连续考了一个星期发现自己真的是手感型选手,成绩全靠天意.手感好了码出200+也没什么问题,推出式子并且打出自己都不信的操作也有过.手感差了......就一个呵呵二字. 然后开始是T总让我们休息了一个星 ...

  3. Jmeter+Ant+Jenkins接口自动化测试(一)_环境部署

    前言: 2017年最后一个月份,今天抽出时间把之前的一些记录分享出来,也为今年画上个简单的句号吧,无论好与坏,无论成功与失败,简单的记忆,不要留下点点空白. 特别提示: 知识是用来分享的,但是也要尊重 ...

  4. 服务器 Python服务停服、起服脚本

    近日,在阿里云服务器上部署了一个Python,Web框架为Tornado,服务器为Ubuntu 16.04. 服务的启动也十分的简单: python services.py 我是利用Xshell工具连 ...

  5. python2 与python3的变化

    1 写文件如果是bytes类型的话,打开文件 open参数设置为wb 2 python2 默认包import是相对路径,python3是绝对路径 3 python3的dict没有has_key方法,用 ...

  6. 快速开发 jQuery 插件的 10 大技巧

    在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了. ...

  7. Node.js 蚕食计划(四)—— Express + SQL Server 搭建电影网站

    前段时间在慕课网上看了 scott 大神的<node+mongodb建站攻略>课程,按照自己的思路做了一遍,发博客记录一下 一.项目介绍 这个项目是一个简单的电影网站,由首页.详情页.评论 ...

  8. Netty入门之HelloWorld

    Netty系列入门之HelloWorld(一) 一. 简介 Netty is a NIO client server framework which enables quick and easy de ...

  9. MySQL使用存储过程代替子查询

    摘要: 出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该 ...

  10. 设计一个有getMin功能的栈(2)

    题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ...