oracle通过decode/case when实现行转列

表结构及数据准备:

-- ----------------------------
-- Table structure for STUDENT_SCORE
-- ----------------------------
DROP TABLE "STUDENT_SCORE";
CREATE TABLE "STUDENT_SCORE" (
  "NAME" VARCHAR2(20 BYTE) VISIBLE,
  "SUBJECT" VARCHAR2(20 BYTE) VISIBLE,
  "SCORE" NUMBER(4,1) VISIBLE
)
;

-- ----------------------------
-- Records of STUDENT_SCORE
-- ----------------------------
INSERT INTO "STUDENT_SCORE" VALUES ('张三', '语文', '11');
INSERT INTO "STUDENT_SCORE" VALUES ('张三', '数学', '22');
INSERT INTO "STUDENT_SCORE" VALUES ('张三', '英语', '33');
INSERT INTO "STUDENT_SCORE" VALUES ('李四', '语文', '44');
INSERT INTO "STUDENT_SCORE" VALUES ('李四', '数学', '55');
INSERT INTO "STUDENT_SCORE" VALUES ('李四', '英语', '66');
INSERT INTO "STUDENT_SCORE" VALUES ('王五', '语文', '77');
INSERT INTO "STUDENT_SCORE" VALUES ('王五', '数学', '88');
INSERT INTO "STUDENT_SCORE" VALUES ('王五', '英语', '99');

decode行转列:

SELECT
	name "姓名",
	sum( decode( subject, '语文', nvl( score, 0 ), 0 ) ) "语文",
	sum( decode( subject, '数学', nvl( score, 0 ), 0 ) ) "数学",
	sum( decode( subject, '英语', nvl( score, 0 ), 0 ) ) "英语" 
FROM
	student_score 
GROUP BY
	name;
 -- group之后可以显示group by的那些列或者通过函数显示
 
 --decode(条件,值1,返回值1,值2,返回值2.....值n,返回值n,default)
 if 条件=1 then
  	return 返回值1;
 elsif 条件=2 then
  	return 返回值2;
 .....
 elsif 条件=值n then
  	renturn 返回值3;
 else
 	return default;
 end if
 --NVL(eExpression1, eExpression2)
 if eExpression1==NULL
 then
 	return eExpression1;
 else
 	return eExpression2;
 
 endif

case when 行转列

SELECT
	name "姓名",
	sum( CASE WHEN subject = '语文' THEN nvl( score, 0 ) ELSE 0 END ) "语文",
	sum( CASE WHEN subject = '数学' THEN nvl( score, 0 ) ELSE 0 END ) "数学",
	sum( CASE WHEN subject = '英语' THEN nvl( score, 0 ) ELSE 0 END ) "英语" 
FROM
	student_score 
GROUP BY
	name;

数据库图:
在这里插入图片描述

实现效果图:
在这里插入图片描述

参考链接:oracle使用decode函数或case when 实现行转列
;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值