oracle中一个表的行列转换
发布网友
发布时间:2022-04-12 12:16
我来回答
共5个回答
热心网友
时间:2022-04-12 13:46
--用case when行列装置,然后分组聚合
SELECT DEPTNO AS "部门编号",
DNAME AS "部门名称",
SUM(F1) AS "文员总工资",
SUM(F2) AS "销售总工资",
SUM(F3) AS "经理总工资",
SUM(F4) AS "主管总工资",
SUM(F5) AS "分析师总工资"
FROM
(select E.DEPTNO,D.DNAME,
case when job = 'CLERK' THEN SAL ELSE 0 END F1,
case when job = 'SALESMAN' then SAL else 0 end f2,
case when job = 'MANAGER' then SAL else 0 end f3,
case when job = 'PRESIDENT' then SAL else 0 end f4,
case when job = 'ANALYST' then SAL else 0 end f5
from emp E,DEPT D
WHERE E.DEPTNO = D.DEPTNO
)
GROUP BY DEPTNO,DNAME追问用这个方法我至少得写2000多个case
追答可以应对行固定的情况。
如果要写2000多个case,那就说明行是不固定的,或者选的转换字段不对。
热心网友
时间:2022-04-12 15:04
结果不固定的行列转换是不可能存在的
原因和简单,比如我有一个表记录为
1 x 2011-11-11
2 y 2011-11-12
转换完应该是把这两行竖起来,
但是你要这每一列的类型都是什么呢???
无法确定,如果你都给定义成nvarchar类型,那长度又是多少?
如果给最大长度,那么字段个数是多少?
如果是根据行数计算,那么表中有百万条记录呢?这拥有百万列的表可能存在吗?
所以说,这东西不可能存在完全通用的,*条件太多。
只能用固定的或者固定*的。
热心网友
时间:2022-04-12 16:38
select WMSYS.WM_CONCAT(col_name) from al
oralce 9以上这个可以用.
不过大小有*.自己试试看吧.
热心网友
时间:2022-04-12 18:30
你这是个 SQL_Server的存储过程啊!
在Pl/sql里面肯定不行啊!
热心网友
时间:2022-04-12 20:38
等待高手