Linux命令如何将竖行改成横行,用DECODE和CASE WHEN将多行单列数据改为单行多列数据(即竖向排列改为横向排列)...
1、几天前,终于修改了SQL查询语句,改为适应报表格式。其中最关键的就是用DECODE和CASE WHEN方式,只要查询结果正确,那么用这两种方式,基本上想要什么格式就可以拿到什么格式。
2、DECODE函数使用:
格式是 DECODE(表字段名,‘数值1’,‘数值2’,‘数值3’,‘数值4’,‘数值5’)。
具体含义:这个函数,实际作用的是,检查指定的表字段,如果字段值=数值1,那么就返回数值2,如果字段值=数值3,那么返回数值4,如果字段值不等于数值1也不等于数值3,那么就返回数值5 。也许前面的表述,说的不那么清楚,就请看下面的示例:
示例表student_arhievement:
student_name
student_arhievement
black
80
jhon
40
jack
80
pher
40
clear
80
ruini
70
pull
30
ada
30
boen
50 select student_arhievement, decode(student_arhievement,'80','pass A','70','pass B','fail') from student_arhievement;
查询结果应该是:
black
pass A
jhon
fail
jack
pass A
pher
fail
clear
pass A
ruini
pass B
pull
fail
ada
fail
boen
fail
这个查询结果应该是很明显了,注意哈,这个查询结果,我是没有经过测试的,有可能出错,也有可能是对的。
我把查询语句改成:
select decode(student_arhievement,'80','pass','70','pass','fail'),count(*) from student_arhievement group by decode(student_arhievement,'80','pass','70','pass','fail') ;
查询结果应该是:
pass 4
fail 5
这里,我在画蛇添足一下,查询语句改成这样:
break on dummy;
compute sum label totalcount of count on dummy;
select null dummy,decode(student_arhievement,'80','pass','70','pass','fail'),count(*) count from student_arhievement group by decode(student_arhievement,'80','pass','70','pass','fail') ;
查询结果是:
pass 4
fail 5
total 9
这个可以给出一个汇总行,就是最后的total行,很不错的东西。
请注意最后的语句,这里有个技巧,就是那个null dummy,其实就是一个伪列,字段名为dummy,但是却没有值,所以pass行和fail行的前几个字段位置上全是空格,因为是NULL,当然就不显示了。经过实际测试,还要注意,dummy伪列的列宽度,因为没有值,所以SQLPLUS会将这个列的宽度定义为1个字符位置,结果导致显示如下:
pass 4
fail 5
t 9
就是最后的汇总行,只显示了一个T,其实就是TOTAL的第一个字符,因为列宽度不够,所以只显示T。办法就是在语句前面增加一个column dummy format a5就可以了。
关于BREAK和COMPUTR,我估计还需要另外一篇文章来专门写,内容比较多。
3、CASE WHEN函数
相对来说,DECODE 函数已经很强大了,但是CASE WHEN函数还要强大的多。
DECODE 函数主要作用是,根据给定的值的要求,就是比如如果字段值是A,那么函数返回就是1,如果字段值是B,那么返回就是2,这个比较适合指定的字段值,有明显的少量基数,就是字段值比较像男女性别这个值,只有男、女或者未知等,但是如果指定的字段值,没有这样的基数,数值全是乱的,从1到100全有,那么用DECODE就很不方便了,这时候CASE WHEN就会方便很多。
CASE WHEN格式:
CASE WHEN 表达式 THEN 返回值1 ELSE 返回值2 END;
这个函数,有一部分功能是和DECODE函数一样的。
仔细看看下面两个:
decode(archivement ,'80’,'pass’,'fail’)
case when arvhivement='80' then 'pass' else 'fail' end
上面这两句,结果是一样的。但是CASE WHEN功能更强。
看下面的表studentu_archievement:
student_name
student_arhievement
black
81
jhon
43
jack
87
pher
35
clear
98
ruini
67
pull
49
ada
89
boen
61
这表中所有同学的成绩全部不一样,这时候用DECODE处理就会很麻烦,CASE WHEN很好用。可以这样写:
select case when student_archievement>60 then 'pass' else 'fail' end,count(*) from student_archievement
group by case when student_archievement>60 then 'pass' else 'nopass' end ;
查询结果:
pass 6
fail 3
这样处理起来就比DECODE要强多了,语句看起来也要简单的很多。
4、竖排变横排的作法
其实,这种竖排变横排的查询需求,有一部分是业务系统没有做好。
看示例表 student_archievement:
student_name
student_class
student_archievement
jack
Mathematics
98
jack
Chinese
67
jack
English
82
ada
Mathematics
78
ada
Chinese
89
ada
English
91
jhon
Mathematics
81
jhon
Chinese
85
jhon
English
79
从某种意义上讲,这样的表结构很不理想,但是实际情况中,有很多这样的表结构。
现在需要把查询结果改成一行就是一个人的3门课的成绩,比如像这样:jack 98 67 82。
处理办法可以这样写:
select student_name,
sum(decode(student_class,'Mathematics',student_archievement)) Mathematics,
sum(decode(student_class,'Chinese',student_archievement)) Chinese,
sum(decode(student_class,'English',student_archievement)) English
from student_archievement
group by student_name;
这句话的执行结果就是:
student_name
Mathematics
Chinese
English
jack
98
67
82
ada
78
89
91
jhon
81
85
79
这样的查询结果,看起来就会舒服很多。
因为文章中的示例数据太过简单了,所以没有办法记录更复杂的计算办法,这里就只写一些相对简单的,以后再进一步添加。
我这里只用到了DECODE函数,当然还是可以用CASE WHEN来做,只是CASE WHEN语句相对复杂点,长度较长而已
Linux命令如何将竖行改成横行,用DECODE和CASE WHEN将多行单列数据改为单行多列数据(即竖向排列改为横向排列)...相关推荐
- 怎么把好几行弄成一行_怎么把excel表格里多行变成一行数据|excel表格中让多行内容变成为一行...
excel怎么把多行数据变成一行 F1=INDEX($A$1:$E$21,ROUNDUP(COLUMN()/5,0),COLUMN()-5*(ROUNDUP(COLUMN()/5,0)-1))向后拉 ...
- EXCEL中多行多列数据与一行或一列数据的互相转换
在平常所用数据中,会出现多行多列数据,但是实际又需要一行或一列形式的数据,或者相反者,那么这篇文章将教会你如何在excel中对多行多列数据与一行一列数据的相互转换.或者将行数据变为列数据.列数据变为行 ...
- 《Linux命令行与shell脚本大全》笔记
初识Linux Shell 什么是Linux Linux可划分为以下四部分: Linux内核 GNU工具 图形化桌面环境 应用软件 深入探究Linux内核 内核主要负责以下四种功能: 系统内存管理 软 ...
- linux uefi转mbr方法,如何将uefi改成mbr分区
uefi改成mbr分区的方法,电脑一键还原重装系统需要用到进行分区,这对技术人员来说就是个小儿科,但是小白们对这个却真的是一窍不通,那么如何将uefi改成mbr分区,很多网友问小编,就让小编告诉你们如 ...
- linux命令与编程笔记
本文章内容来自与"的Linux的命令行与外壳脚本编程大全.第3版" 目录 Linux命令. 1 进程相关. 5 Ps命令. 5 TOP命令. 6 Kill命令. 6 Type(查看 ...
- 《Linux命令学习手册》系列分享专栏
<Linux命令学习手册>系列分享专栏 <Linux命令学习手册>已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/20 ...
- linux命令和shell语言的区别,shell脚本语言与linux命令的联系与区别
使用linux确定是要会使用命令的,就算提供有用户界面,绝大部分功能仍是要经过命令行去操做的.而shell脚本语言也是运行在linux上的脚本语言,对于服务器运维人员也是几乎必需要掌握的.而shell ...
- asp.net(c#) 将dbf转换为xls或wps,并将数据的列名改成中文;并判断本机是否安装office2003,2007和wps2007,2010...
using Microsoft.Office.Interop.Excel;//转换为excel时,需要引用此命名空间 using ET;//转换为wps时,需要引用此命名空间 using KSO;// ...
- Linux 命令(10)—— split 命令
1.命令简介 split 命令用于将一个大文件分割成较小的文件,默认每 1000 行分割成一个小文件.有时需要将文件分割成更小的片段,比如为提高可读性.生成日志等. 2.命令格式 split [OPT ...
最新文章
- 麻省理工学院揭秘男女配对的真相
- 分布式WebSocket架构
- 【转载】Qt Creator 添加自定义注释
- 计算机应用能力 中文字处理,全国职称计算机应用能力考试《Word 2003中文字处理》考试大纲...
- 新手入门深度学习 | 2-3:文本数据建模流程示例
- NLP Chinese Corpus:大规模中文自然语言处理语料
- python 3.8.0安卓_Python 3.8.0稳定版正式发布
- 解密 云HBase 冷热分离技术原理
- 反病毒软件技术简析与探索(2009年5月18日)
- TOONTRACK Electronic Edge EZX(Toontrack打击乐扩展包)
- 最好用的 7 款 Vue 3 富文本编辑器
- 文本时间修改器android,NewFileTime(文件时间修改器)
- 消息队列的介绍及配置
- 月圆茶润.人婵娟 小茶控·2021中秋茶礼 如“月”而至
- 电梯plc的io分配_plc的io分配表怎么写
- SearchView详细使用
- 计算机专用安全机箱,电脑数据信息安全机箱,PC防盗安全机箱
- ecshop整合最土团购程序(uc)详细教程
- 压力表负值表示什么_压力表常见的10种故障分析和修理方法
- 在线网页视频播放器(flash flv播放器)
热门文章
- 学计算机要高智商吗,这7大高智商专业,很容易挂科,如果不是学霸级人物,最好不要报考...
- 中小学课外培训机构陷入无序竞争,怎么才能异军突起?
- 盛金公式解一元三次方程_一元三次方程解法(卡尔丹公式法盛金公式法)
- Visio设置默认字体大小的方法
- ACCV 2020 Mutual Guidance
- 制造并批量生产现实版“储物戒指”
- MSI (Message Signaled Interrupts)
- Typora文字变红
- js输出sb (!(~+[]) + {})[--[~+][+[]] * [~+[]] + ~~!+[]] + ({} + [])[[~!+[]] * ~+[]] 图解
- Matplotlib设置坐标轴日期格式