[数据库] SQL查询语句表行列转换及一行数据转换成两列

简介:
本文主要讲述了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/ )


目录
相关文章
|
4天前
|
SQL JavaScript 前端开发
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
这篇文章详细介绍了如何在Vue.js中使用分页组件展示从数据库查询出来的数据,包括前端Vue页面的表格和分页组件代码,以及后端SpringBoot的控制层和SQL查询语句。
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
|
3天前
|
SQL 存储 关系型数据库
数据库SQL入门指南
数据库SQL入门指南
|
2天前
|
存储 NoSQL 算法
使用图数据库进行复杂数据建模:探索数据关系的无限可能
【8月更文挑战第17天】图数据库以其高效的关系查询能力、直观的数据表示方式、灵活的数据模型和强大的可扩展性,在复杂数据建模和查询中展现出了巨大的潜力。随着大数据和人工智能技术的不断发展,图数据库的应用领域也将不断拓展和深化。对于需要处理复杂关系网络和数据关联性的场景来说,图数据库无疑是一个值得深入研究和应用的强大工具。
|
2天前
|
存储 关系型数据库 MySQL
mysql数据库查询时用到的分页方法有哪些
【8月更文挑战第16天】在MySQL中,实现分页的主要方法包括:1)使用`LIMIT`子句,简单直接但随页数增加性能下降;2)通过子查询优化`LIMIT`分页,提高大页码时的查询效率;3)利用存储过程封装分页逻辑,便于复用但需额外维护;4)借助MySQL变量实现,可能提供更好的性能但实现较复杂。这些方法各有优缺点,可根据实际需求选择适用方案。
|
3天前
|
SQL 关系型数据库 数据库
数据库空间之谜:彻底解决RDS for SQL Server的空间难题
【8月更文挑战第16天】在管理阿里云RDS for SQL Server时,合理排查与解决空间问题是确保数据库性能稳定的关键。常见问题包括数据文件增长、日志文件膨胀及索引碎片累积。利用SQL Server的动态管理视图(DMV)可有效监测文件使用情况、日志空间及索引碎片化程度。例如,使用`sp_spaceused`检查文件使用量,`sys.dm_db_log_space_usage`监控日志空间,`sys.dm_db_index_physical_stats`识别索引碎片。同时,合理的备份策略和文件组设置也有助于优化空间使用,确保数据库高效运行。
|
4天前
|
资源调度 关系型数据库 MySQL
【Flink on YARN + CDC 3.0】神操作!看完这篇教程,你也能成为数据流处理高手!从零开始,一步步教会你在Flink on YARN模式下如何配置Debezium CDC 3.0,让你的数据库变更数据瞬间飞起来!
【8月更文挑战第15天】随着Apache Flink的普及,企业广泛采用Flink on YARN部署流处理应用,高效利用集群资源。变更数据捕获(CDC)工具在现代数据栈中至关重要,能实时捕捉数据库变化并转发给下游系统处理。本文以Flink on YARN为例,介绍如何在Debezium CDC 3.0中配置MySQL连接器,实现数据流处理。首先确保YARN上已部署Flink集群,接着安装Debezium MySQL连接器并配置Kafka Connect。最后,创建Flink任务消费变更事件并提交任务到Flink集群。通过这些步骤,可以构建出从数据库变更到实时处理的无缝数据管道。
16 2
|
4天前
|
XML SQL JavaScript
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
这篇文章介绍了如何在Vue页面中结合SpringBoot、MyBatis、ElementUI和ECharts,实现从数据库获取数据并展示为图表的过程,包括前端和后端的代码实现以及遇到的问题和解决方法。
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
|
4天前
|
JavaScript 前端开发 数据处理
在vue中的form表单中下拉框中的数据来自数据库查询到的数据
这篇文章介绍了如何在Vue框架的表单中将下拉框的数据通过后端接口从数据库动态查询并加载,包括前端HTML代码、JavaScript数据处理、后端接口实现以及表单提交的完整流程。
在vue中的form表单中下拉框中的数据来自数据库查询到的数据
|
1天前
|
SQL 移动开发 Oracle
SQL查询连续六天数据记录的技巧与方法
在数据库查询中,实现针对连续几天(如连续六天)的数据筛选是一个常见且稍具挑战性的任务
|
21天前
|
SQL JSON 数据库
influxdb 端点使用http进行sql查询,写数据
influxdb 端点使用http进行sql查询,写数据
59 0