原文来自:http://blog.csdn.net/Eastmount/article/details/50559008
本文主要讲述了SQL查询语句表之间的行列转换,同时也包括如何将一行数据转换成两列数据的方法、子查询的应用、decode函数的用法。希望文章对你有所帮助~
- 1.创建数据库表及插入数据
- 2.子查询统计不同性质的学生总数
- 3.一行数据转换成两列数据 union all
- 4.表行列数据转换(表转置)
1.创建数据库表及插入数据
创建数据库、创建学生表并设置主键、插入数据代码如下:
- --创建数据库
- create database StudentMS
- --使用数据库
- use StudentMS
- --创建学生表 (属性:姓名、学号(pk)、学院、出生日期、性别、籍贯)
- create table xs
- (
- name varchar(10) not null,
- id varchar(10) not null,
- xy varchar(10),
- birthday datetime,
- xb char(2),
- jg varchar(8)
- )
- --创建学生表主键:学号
- alter table xs
- add constraint
- pk_xs primary key(id)
- --插入数据
- insert into xs
- (id, name, xb, birthday, xy, jg)
- values('1160001', '刘备', '男', '1991-11-5', '软件学院', '河北省');
输出数据如下图所示:
2.子查询统计不同性质的学生总数
使用子查询统计不同学院总人数、不同性别总人数和河北/河南学生总人数。
- --子查询统计人数
- select a.a_num as 软院人数, b.b_num as 计院人数, c.c_num as 自动化人数,
- d.d_num as 男生人数, e.e_num as 女生人数, f.f_num as 河北河南人数
- from
- (select count(*) as a_num from xs where xy='软件学院') a,
- (select count(*) as b_num from xs where xy='计算机学院') b,
- (select count(*) as c_num from xs where xy='自动化学院') c,
- (select count(*) as d_num from xs where xb='男') d,
- (select count(*) as e_num from xs where xb='女') e,
- (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其它表也可以继续添加。
- select '软院人数' as "统计类别", count(*) as "数量" from xs where xy='软件学院'
- union all
- select '计院人数', count(*) from xs where xy='计算机学院'
- union all
- select '自动化人数', count(*) from xs where xy='自动化学院'
- union all
- select '男生人数', count(*) from xs where xb='男'
- union all
- select '女生人数', count(*) from xs where xb='女'
- union all
- 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)计算校级的个数。
- select whxs1.num1 as 项目名称, whxs2.num2 as 数量
- from
- (select decode(KWHD_WH_XZ, '校级', '校级总数', KWHD_WH_XZ) as num1
- from T_WSTB_KWHD_1 t
- where KWHD_WH_XZ='校级'
- group by KWHD_WH_XZ) whxs1,
- (select sum(decode(t.KWHD_WH_XZ,'校级',1,0)) as num2
- from T_WSTB_KWHD_1 t
- where KWHD_WH_XZ='校级'
- group by KWHD_WH_XZ ) whxs2;
输出如下,但是再添加一行数据如何实现呢?所以还是推荐UNION ALL。
4.表行列数据转换(表转置)
参考:http://blog.163.com/dreamman_yx/blog/static/26526894201121595846270
SQL语句如下:
- select country, sum(case when type='A' then money end) as A,
- sum(case when type='B' then money end) as B,
- sum(case when type='C' then money end) as C
- from table1
- group by country
另一种方法源自文章:http://blog.sina.com.cn/s/blog_63772d910100pmln.html
方法介绍:
- decode(条件,值1,结果1,值2,结果2,值3,结果3,... 值n,结果n,缺省值)
- 函数类比:
- IF 条件=值1 THEN
- RETURN(结果1)
- ELSIF 条件=值2 THEN
- RETURN(结果2)
- ......
- ELSIF 条件=值n THEN
- RETURN(结果n)
- ELSE
- RETURN(缺省值)
- END IF
举个例子如下:
SQL语句如下,其中sum(decode(t.result,'胜',1,0))表示result字段如果值为“胜”,则decode的结果值为1,否则取缺省值0,最后sum统计加和。
- select
- name as 姓名,sum(decode(t.result,'胜',1,0)) as 胜,sum(decode(t.result,'负',1,0)) as 负
- from t_result t
- group by name
- order by 胜 desc,负 asc
最后希望文章对你有所帮助,其实SQL语句中还是有很多非常高深的变化,目前只窥得一二啊!fighting...O(∩_∩)O
(By:Eastmount 2016-01-22 深夜5点 http://blog.csdn.net//eastmount/ )
[数据库] SQL查询语句表行列转换及一行数据转换成两列的更多相关文章
-
WordPress 常用数据库SQL查询语句大全
在使用WordPress的过程中,我们少不了要对数据库进行修改操作,比如,更换域名.修改附件目录.批量修改文章内容等等.这个时候,使用SQL查询语句可以大大简化我们的工作量. 关于如何操作SQL查询语 ...
-
从数据库中查询所有表及所有字段的SQL语句
从数据库中查询所有表及所有字段的SQL语句 由于一个小项目的需要,近日完成一个从数据库中查询所有表及所有字段的方法,其实用两条SQL语句就可以完成. Sql Server版:列出当前DB中所有表:se ...
-
MySQL数据库详解(一)执行SQL查询语句时,其底层到底经历了什么?
一条SQL查询语句是如何执行的? 前言 大家好,我是WZY,今天我们学习下MySQL的基础框架,看一件事千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于MyS ...
-
Hibernate原生SQL查询多表关联,SQL语句要注意的问题
Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...
-
转: 从Mysql某一表中随机读取n条数据的SQL查询语句
若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...
-
数据库SQL的多表查询
数据库 SQL 的多表查询:eg: table1: employees, table2: departments,table3: salary_grades; 一:内连接: 1):等值连接: 把表em ...
-
从Mysql某一表中随机读取n条数据的SQL查询语句
若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...
-
PowerDesigner创建表 拷贝创建表语句 SQLSERVER创建数据库 使用查询 创建表 并且添加数据
PowerDesigner创建表 : 1.双击打开PowerDesigner 2.双击打开Create model 3左键点击Model types,再点击Physical Data m ...
-
15个初学者必看的基础SQL查询语句
本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 本文将分享15个初学者必看的基础SQL查询语句,都很基础,但是你不一定都会,所以好好看看吧. 1.创建表和数据插 ...
随机推荐
-
删除/var/lib/docker
FATA[0000] Get http:///var/run/docker.sock/v1.18/containers/json?all=1: dial unix /var/run/docker.so ...
-
踩到两只“bug”
近期在修复ex和头儿的代码时,碰到两个特别点的bug,其实也不能称之为bug,非常简单的用法,稍不严谨点可能就出错了. 第一个是in_array,大家都知道功能是检查一个值是否在数组中,第三个参数传入 ...
-
MYSQLI - mysqli操作数据库
<?php //模型类 class Model { //数据库连接 private $_conn = NULL; //where语句 private $_where = NULL; //表名称 ...
-
php中sql语句常见错误
.php文件中sql语句的写法导致的错误如下: 1.$logSql="select * from jd_login where uname=".$u."and upwd= ...
-
Spring-cloud(六) Hystrix入门
前提 一个可用的Eureka注册中心(文中以之前博客中双节点注册中心,不重要) 一个连接到这个注册中心的服务提供者 快速入门 项目搭建 搭建一个新maven项目,artifactid为Ribbon-c ...
-
安装composer时,提示 /usr/bin/env: php: 没有那个文件或目录
今晚在Ubuntu环境上安装composer后,想查看下是否安装成功,使用composer -v,结果提示:/usr/bin/env: php: 没有那个文件或目录 现说说我的解决办法: 它提示的原因 ...
-
centos7设置httpd
1.httpd开机自启动 systemctl enable httpd.service 2.httpd开机不自启动 systemctl disable httpd.service 3.启动httpd ...
-
Python开发环境-Pyenv安装使用
安装使用-Pyenv 简单的python版本管理:pyenv 管理python解释器 管理python版本 管理python的虚拟环境 官网:https://github.com/pyenv/pyen ...
-
undo空间满的处理方法(含undo的学习与相关解释)
1.查看数据库当前实例使用的是哪个UNDO表空间: show parameter undo_tablespace 2.查看UNDO表空间对应的数据文件和大小 pages col file_name f ...
-
python基础学习20----线程
什么是线程 线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程中 ...