表的转置 行转列: DECODE(Oracle) 和 CASE WHEN 的异同点
异同点
- 都可以对表行转列;
- DECODE功能上和简单Case函数比较类似,不能像Case搜索函数一样,进行更复杂的判断
- 在Case函数中,可以使用BETWEEN, LIKE, IS NULL, IN, EXISTS等等(也可以使用NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。)
DECODE方法 (Oracle公司独家)
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
--该函数的含义如下:
IF 条件=值1 THEN RETURN(翻译值1)
ELSIF 条件=值2 THEN RETURN(翻译值2)
......
ELSIF 条件=值n THEN RETURN(翻译值n)
ELSE RETURN(缺省值)
END IF
--行转列
SELECT name,
SUM(DECODE(Subject, '数学', Score, 0)) 数学,
SUM(DECODE(Subject, '语文', Score, 0)) 语文,
SUM(DECODE(Subject, '英语', Score, 0)) 英语
FROM Scores
GROUP BY name
CASE WHEN
SELECT name,
SUM( CASE WHEN Subject='数学' THEN Score ELSE 0 END) 数学,
SUM( CASE WHEN Subject='语文' THEN Score ELSE 0 END) 语文,
SUM( CASE WHEN Subject='英语' THEN Score ELSE 0 END) 英语
FROM Scores group by name;
Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略,Else部分的默认值是NULL
Case具有两种格式,简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式
在Case函数中,可以使用BETWEEN, LIKE, IS NULL, IN, EXISTS等等(也可以使用NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。)
--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE
WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
--根据条件有选择的UPDATE。
UPDATE Scores SET grade =
CASE WHEN score >= 85 THEN '优秀'
WHEN score >= 70 AND score < 85 THEN '良好'
WHEN score >= 60 AND score < 70 THEN '及格'
ELSE '不及格' END;
--在Case函数中使用聚合函数:COUNT, SUM, AVG, MAX, MIN
SELECT name,
CASE WHEN COUNT(*) = 1 THEN MAX(subject)
ELSE MAX(CASE WHEN major = 'Y' THEN subject ELSE NULL END)
END AS major_subject
FROM Scores GROUP BY name;
Scores表结构和实现如下


表的转置 行转列: DECODE(Oracle) 和 CASE WHEN 的异同点的更多相关文章
- sql server数据库行转列及巧用case when、和row_number用法例子
select 身份证号码, MAX(t.单位编号) 单位编号, MAX(t.姓名) 姓名, MAX(case when t.rows=1 then convert(varchar(max),疾病名称) ...
- oracle 行转列~列转行(几种方法)
工作中,我们经常会碰到行转列的情况 这里我介绍几种简单的方法--行转列 1.oracle的pivot函数 原表 使用pivot函数: with temp as(select '四川省' nation ...
- SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...
- SQL2005语句实现行转列,列转行
在做报表时,经常需要将数据表中的行转列,或者列转行,如果不知道方法,你会觉得通过SQL语句来实现非常难.这里,我将使用pivot和unpivot来实现看似复杂的功能.这个功能在sql2005及以上版本 ...
- Sqlserver中PIVOT行转列透视操作
创建表: IF OBJECT_ID('T040_PRODUCT_SALES') IS NOT NULL DROP TABLE T040_PRODUCT_SALES create table T040_ ...
- mysql实现行转列功能
实现从图一转行成图二的功能: 图一: 图二: 建表语句: CREATE TABLE `t_user_score` ( `id` ) NOT NULL AUTO_INCREMENT COMMENT '主 ...
- MySQL 行转列 -》动态行转列 -》动态行转列带计算
Pivot Table Using MySQL - A Complete Guide | WebDevZoomhttp://webdevzoom.com/pivot-table-using-mysql ...
- hive行转列,列转行
实例一:来源: https://www.cnblogs.com/kimbo/p/6208973.html 行转列 (对某列拆分,一列拆多行) 使用函数:lateral view explode(spl ...
- C# Winform中FpSpread表格控件设置固定的(冻结的)行或列
在项目中我们经常会用到固定表头的操作,FpSpread提供了冻结行或列的属性. 你可以冻结表单中的行或列(使其不可滚动). 你可以冻结任意个表单顶部的行,使其成为前导行,你也可以冻结左侧任意多个列,使 ...
随机推荐
- vue项目安装sass/scss
vue 添加scss 安装好之后使用: 注意scss和sass的语法区别,scss是用传统花括号,sass是缩进控制,看个人习惯选择语言 sass语法看这里==>sass基本语法 vue项目编译 ...
- ORACLE 归档日志打开关闭方法
一 设置为归档方式 1 sql> archive log list; #查看是不是归档方式 2 sql> alter system set log_archive_start=true ...
- linux 下使用 curl post
命令: curl -X POST -d @/etc/lazada/lazada_tracking.txt http://localhost:8080/booking/rs/LazadaServic ...
- jsp中文乱码
<%@page pageEncoding="UTF-8"%> <meta http-equiv="Content-Type" content= ...
- Windows下开启Redis PHP拓展
1. 安装Redis windows下redis的版本,git地址https://github.com/MSOpenTech/redis/releases 2. 打开phpInfo,查看当前PHP是N ...
- groovy 从jsonList中读取某个字段
今天又被groovy的高效吓到了. 想提取所有的itemCodes,两种玩法 一.常规方法:遍历组装 RestResult items = getListPager() def temp = [] i ...
- js 只允许输入数字
<input id="credit" type="text" class="nummber" onkeyup="value= ...
- 深度学习原理与框架-Tensorflow卷积神经网络-卷积神经网络mnist分类 1.tf.nn.conv2d(卷积操作) 2.tf.nn.max_pool(最大池化操作) 3.tf.nn.dropout(执行dropout操作) 4.tf.nn.softmax_cross_entropy_with_logits(交叉熵损失) 5.tf.truncated_normal(两个标准差内的正态分布)
1. tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME') # 对数据进行卷积操作 参数说明:x表示输入数据,w表示卷积核, stride ...
- google event
一目了然,也不用多说了,随便记录下,内部实现基于观察者模式 TestEvent public class TestEvent { private final int message; public T ...
- Python基础-TypeError:takes 2 positional arguments but 3 were given
Error: 今天写一段简单类定义python代码所遇到报错问题:TypeError: drive() takes 2 positional arguments but 3 were given 代码 ...