本文主要讲述了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 THENRETURN(结果1)
ELSIF 条件=值2 THENRETURN(结果2)......
ELSIF 条件=值n THENRETURN(结果n)
ELSERETURN(缺省值)
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查询语句表行列转换及一行数据转换成两列相关推荐

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

    https://www.wpdaxue.com/wordpress-sql.html 在使用WordPress的过程中,我们少不了要对数据库进行修改操作,比如,更换域名.修改附件目录.批量修改文章内容 ...

  2. SQL查询案例:行列转换[行转列, 使用 CASE WHEN 处理]

    行列装换--使用CASE WHEN 测试表与测试数据 CREATE TABLE TestRowCol ( name   VARCHAR(10), place VARCHAR(10), valuw IN ...

  3. java查询学号数据库_数据库SQL查询语句练习题 PDF 下载

    主要内容: 设教学数据库Education有三个关系: 学生关系S(SNO,SNAME,AGE,SEX,SDEPT):学习关系SC(SNO,CNO,GRADE):课程关系C(CNO,CNAME,CDE ...

  4. MySQL数据库高级SQL查询语句(单表查询,多表联合查询)

    目录 SQL查询语句 基础查询 条件查询 模糊查询 字段控制查询 排序 聚合函数 分组查询 having子句 limit分页查询 多表连接查询 SQL查询语句 数据查询语言. 数据库执行DQL语句不会 ...

  5. (走向DBA[MSSQL篇] - 从SQL语句的角度提高数据库的访问性能)一些SQL查询语句应加上nolock

    http://kb.cnblogs.com/page/124787/#s8 最近公司来一个非常虎的DBA,10几年的经验,这里就称之为蔡老师吧,在征得我们蔡老同意的前提下 ,我们来分享一下蔡老给我们带 ...

  6. R语言构建仿真数据库(sqlite)并使用dplyr语法和SQL语法查询数据库、将dplyr语法查询语句翻译为SQL查询语句

    R语言构建仿真数据库(sqlite)并使用dplyr语法和SQL语法查询数据库.将dplyr语法查询语句翻译为SQL查询语句 目录

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

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

  8. 没错,纯SQL查询语句可以实现神经网络

    我们熟知的SQL是一种数据库查询语句,它方便了开发者在大型数据中执行高效的操作.但本文从另一角度嵌套SQL查询语句而构建了一个简单的三层全连接网络,虽然由于语句的嵌套过深而不能高效计算,但仍然是一个非 ...

  9. Python学习日志16 - 数据库SQL查询

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 Python学习日志16课 - 数据库SQL查询 DQL ...

最新文章

  1. Golang copy()函数
  2. 【第五单元】vim与文件管理(10.1)
  3. ai驱动数据安全治理_人工智能驱动的Microsoft工具简介
  4. Github:视觉问答最新资源汇总
  5. Python操作MySQL存储,这些你都会了吗?
  6. 自写保存字符串或文件为asp.net缓存的类
  7. 编程语言python入门-2020年10月编程语言:Java、Python 龙争虎斗
  8. python解释器调用_Python3.x那些事儿:[2]如何调用解释器-百度经验
  9. java hough_java – 如何实现Hough变换?
  10. image 搜索docker_docker images命令-列出image
  11. knot DNS 02 Tips - XDP
  12. MATLAB读取MIT心电信号
  13. 处理火狐浏览器播放哔哩哔哩(BiliBili)视频时无法倍速问题
  14. word2013怎么去掉所有文字下面的波浪线
  15. 宁愿吃生活的苦,也不愿坚持学习
  16. 卷积码树状图怎么画_卷积码是什么 卷积码编码原理介绍【图文】
  17. ubuntu14.4安装gtx970显卡驱动的艰辛历程
  18. 秒杀ecshop的前台写shell 0day
  19. 如何利用Netcat进行黑客攻击第1部分:基础知识
  20. 若依整合Echarts

热门文章

  1. 繁华落尽,捡拾一地伤
  2. 【游戏开发】Lua Love2d | Love2d基础知识
  3. 【瑞云知道】-5款广受欢迎的渲染软件
  4. python--raise
  5. 小学生护眼台灯哪个品牌好?眼医生分享的护眼灯品牌
  6. UTF8和UNICODE的关系及转换规则(字库篇一)
  7. Canvas 游戏——俄罗斯方块
  8. 贺岁喜庆手绘插画|牛年主题,新年春节年味素材
  9. java crm视频,Java架构师进阶篇CRM项目视频教程
  10. 微信公众号菜单如何直接跳到微信小程序