表的转置 行转列: 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表结构和实现如下

image
image

转载于:https://www.cnblogs.com/niudaxianren/p/10018715.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用转置函数来实现行转列,而避免使用 CASE WHEN 语句。具体的转置函数可以根据你使用的数据库系统而有所不同,下面是一些常见数据库系统中的示例: 1. MySQL/MariaDB: 使用 GROUP_CONCAT 和 GROUP BY 语句可以将行转列。例如,假设有一个名为 `table_name` 的,其中包含 `id`、`column_name` 和 `value` 列,你可以按照 `id` 进行分组并使用 GROUP_CONCAT 来将不同的 `column_name` 和 `value` 值连接起来,从而实现行转列。示例如下: ```sql SELECT id, GROUP_CONCAT(column_name, '=', value) AS transposed_values FROM table_name GROUP BY id; ``` 2. PostgreSQL: 在 PostgreSQL 中,可以使用 crosstab 函数来进行行转列。首先,确保已启用 tablefunc 扩展。然后,你可以使用 crosstab 函数并提供用于确定行和列的查询。以下是一个示例: ```sql SELECT * FROM crosstab( 'SELECT id, column_name, value FROM table_name ORDER BY 1, 2', 'SELECT DISTINCT column_name FROM table_name ORDER BY 1' ) AS ct (id integer, column1 text, column2 text, ...); ``` 3. Oracle: Oracle 提供了 PIVOT 操作符来实现行转列。你可以使用 PIVOT 操作符,并提供用于确定行和列的查询。以下是一个示例: ```sql SELECT * FROM ( SELECT id, column_name, value FROM table_name ) PIVOT ( MAX(value) FOR column_name IN ('column1', 'column2', ...) ); ``` 这些示例都是根据常见的数据库系统提供的功能来实现行转列的。具体的实现方式可能因数据库系统的版本和配置而有所不同,你可以根据自己的具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值