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的更简便的实现转换的方式。