原文来自: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. 重温javascript数据类型

    在javaScript中,有五种简单的数据类型,分别是 Undefined Null Boolean Number String 还有一种复杂的数据类型object,object本质是有一组无序的名值 ...

  2. 鸟哥的linux私房菜学习-(二)VMware虚拟机及linux系统安装过程

    一.安装虚拟机 1.虚拟机常用版本及注册码地址:https://pan.baidu.com/s/1dFnkBrN#list/path=%2FSoftware%20Big%2FVMware%20Work ...

  3. Integration Services 服务连接失败,拒绝访问以及无法检索数据报错问题

    第一个方法比较简单:把域账号添加admin组即可: 第二种方法: 添加域账号到分布式 COM 组 命令提示符下运行 dcomcnfg.exe 下一步 下一步 启动和激活权限 下一步 访问权限 同上设置 ...

  4. Netty入门之客户端与服务端通信(二)

    Netty入门之客户端与服务端通信(二) 一.简介 在上一篇博文中笔者写了关于Netty入门级的Hello World程序.书接上回,本博文是关于客户端与服务端的通信,感觉也没什么好说的了,直接上代码 ...

  5. python 常用算法

    算法就是为了解决某一个问题而采取的具体有效的操作步骤 算法的复杂度,表示代码的运行效率,用一个大写的O加括号来表示,比如O(1),O(n) 认为算法的复杂度是渐进的,即对于一个大小为n的输入,如果他的 ...

  6. linux 卸载安装node npm

    1. 卸载node npm (1) 先卸载 npm: sudo npm uninstall npm -g (2) 然后卸载 Node.js. (2.1) 如果是 Ubuntu 系统并使用 apt-ge ...

  7. Python pandas ERROR 2006 (HY000): MySQL server has gone away

    之前在做python pandas大数据分析的时候,在将分析后的数据存入mysql的时候报ERROR 2006 (HY000): MySQL server has gone away 原因分析:在对百 ...

  8. 在webstorm开发微信小程序之使用阿里自定义字体图标

    1.下载阿里图标,解压出来之后有个.css文件 然后复制这css里面的所有代码 2.新建一个wxss文件,例如我新建的就是iconfont.wxss,然后把刚才复制的所有代码,复制到这个文件里面去. ...

  9. docker的相关使用

    1.docker ps 列出所有容器 2.docker images 查看docker镜像 3.docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 运行容器 4 ...

  10. 【转载】OAuth2 流程

    OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为R ...