oracle的行转列和列转行

Posted vbvb520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle的行转列和列转行相关的知识,希望对你有一定的参考价值。

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)暂无,可以使用存储过程实现

 

以上是关于oracle的行转列和列转行的主要内容,如果未能解决你的问题,请参考以下文章

Hive 行转列 & 列转行

sql的行转列和列转行

MySQL行转列与列转行

sql面试:sql中的行转列和列转行

SQL2000行转列于列转行问题,急~~~ (部门是不确定几个的)

SAS行转列&&列转行