表的转置 行转列: 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提供了冻结行或列的属性. 你可以冻结表单中的行或列(使其不可滚动). 你可以冻结任意个表单顶部的行,使其成为前导行,你也可以冻结左侧任意多个列,使 ...
随机推荐
- 安全测试3_Web后端知识学习
其实中间还应该学习下web服务和数据库的基础,对于web服务大家可以回家玩下tomcat或者wamp等东西,数据库的话大家掌握基本的增删该查就好了,另外最好掌握下数据库的内置函数,如:concat() ...
- 事件驱动架构 (Event-Driven Architecture,EDA) 简介
EDA 是一种侧重于以生成/消费为基础的异步通信的架构模式.这主要对照于传统的基于线程的同步系统. EDA 是一种以事件 (event)为核心,提供事件产生,路由,消费已经结果回调等机制的架构模式. ...
- python中使用tabula爬取pdf数据并导出表格
Tabula是专门用来提取PDF表格数据的,同时支持PDF导出CSV.Excel格式. 首先安装tabula-py: tabula-py依赖库包括Java.pandas.numpy所以需要保证运行环境 ...
- MySQL----ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
1.问题描述 在导入同事提供的一个sql文件时候,出现了一个1071错误,总结学习一下: 2.分析问题 错误的字面意思是说mysql字段设置的值太长了,不能大于767个字节,在网上找了一些资料后才知道 ...
- shell中的时间值提取(date)
shell中的时间值提取(date) 方法1 # date +%F # date +%T # cat time.sh #!/bin/bash DATE=`date +%F | sed 's/-//g' ...
- gentoo rtthread scons error: unknown type name 'fd_set
手动在rtconfig.h中加人 #define HAVE_SYS_SELECT_H 就能编译过了
- 34.scrapy解决爬虫翻页问题
这里主要解决的问题: 1.翻页需要找到页面中加载的两个参数. '__VIEWSTATE': '{}'.format(response.meta['data']['__VIEWSTATE']), '__ ...
- spark 常用技巧总结
解析url scala> import java.net.URLimport java.net.URL scala> val urlstr="http://www.baidu.c ...
- C#USB设备枚举Kernel32的PInvoke
using System; using System.Runtime.InteropServices; using System.Security; namespace Splash { #regio ...
- PHP + Apache 在 Linux(centos7)系统下的环境搭建,基于 yum
(本文采用的是 Centos7 的操作系统,简单起见,以下全部采用 yum 安装,有这么好用的东西为什么要自己去一个一个编译呢) 1, 安装 Apache => yum -y install ...