oracle的行转列和列转行

本文介绍SQL中如何实现行转列与列转行的操作,包括使用GROUP BY、聚合函数、DECODE/CASE WHEN语句进行行转列,以及通过UNION ALL实现列转行的方法。

1.行转列:

一、最初的数据:

转换之后的数据:

二、转换的语句:

--统计各职位的人员在各部门的分布人数:
SELECT T.JOB, SUM(DECODE(T.JOB, 'CLERK', 1, NULL)) AS COUNT1
, SUM(DECODE(T.JOB, 'SALESMAN', 1, NULL)) AS COUNT2
, SUM(DECODE(T.JOB, 'PRESIDENT', 1, NULL)) AS COUNT3
, SUM(DECODE(T.JOB, 'MANAGER', 1, NULL)) AS COUNT4
, SUM(DECODE(T.JOB, 'ANALYST', 1, NULL)) AS COUNT5
FROM EMP T
GROUP BY T.JOB;

这样写的结果是:

虽然与需要的结果相差不远,但是还是不行

三、最后的写法:

--统计各职位的人员在各部门的分布人数:

SELECT T.JOB, (CASE WHEN T.JOB='CLERK' THEN SUM(DECODE(T.JOB, 'CLERK', 1, NULL))
WHEN T.JOB='SALESMAN' THEN SUM(DECODE(T.JOB, 'SALESMAN', 1, NULL))
WHEN T.JOB='PRESIDENT' THEN SUM(DECODE(T.JOB, 'PRESIDENT', 1, NULL))
WHEN T.JOB='MANAGER' THEN SUM(DECODE(T.JOB, 'MANAGER', 1, NULL))
ELSE SUM(DECODE(T.JOB, 'ANALYST', 1, NULL)) END) AS NUM
FROM EMP T
GROUP BY T.JOB

得到的结果就是:

总结:行转列主要使用的是group by和聚合函数(max,sum),decode函数来实现的,这是原始的写法。还有一种使用pivot的更简便的实现转换的方式。

2.列转行

一、最初的数据:

最后的数据:

二、写法

  (1)采用union all的方式实现

--列转行,将学科变成行显示
SELECT ID,'语文' AS COURSE, 语文 AS SCORE FROM STUDENT
UNION ALL
SELECT ID,'数学' AS COURSE, 数学 AS SCORE FROM STUDENT
UNION ALL
SELECT ID,'英语' AS COURSE, 英语 AS SCORE FROM STUDENT
ORDER BY ID

  (2)暂无,可以使用存储过程实现

 

转载于:https://www.cnblogs.com/qadyyj/p/5599693.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值