天天看点

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

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

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

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

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

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

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

输出数据如下图所示:

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

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

输出结果:

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

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

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

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

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

其实简单编写SQL语句,前端再处理这些数据更加方便,当然SQL也是能处理的。

当时走进了一个误区,认为"软件人数"是select中as自定义的一行数据的属性,如何显示在表中呢?当时是通过Oracle方法decode自定义显示的,其实直接输出,union all取代子查询即可。当然union all其它表也可以继续添加。

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)计算校级的个数。

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

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

SQL语句如下:

方法介绍:

举个例子如下:

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

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

最后希望文章对你有所帮助,其实SQL语句中还是有很多非常高深的变化,目前只窥得一二啊!fighting...O(∩_∩)O