select * from table pivot( sum([value]) for [ITEM] in ([A_MAX_CURRENTL],[A_MAX_CURRENTU],[A_MOTOR_PI_COUNTL],....))as s
举例说明:
①.、固定列数的行列转换
如
student subject grade
--------- ---------- --------
......
转换为
语文 数学 英语
语句如下:select student,
sum(decode(subject,'语文', grade,null)) "语文",
sum(decode(subject,'数学', grade,null)) "数学",
sum(decode(subject,'英语', grade,null)) "英语"
from table
group by student;
--- -----------
①. 我
①. 是
①. 谁
①. 我是谁
这一类型的转换可以借助于PL/SQL来完成,这里给一个例子
IS
BEGIN
END LOOP;
END;
或者不用pl/sql,利用分析函数和 CONNECT_BY 实现:
FROM t))
START WITH rn1 IS NULL
CONNECT BY rn1 = PRIOR rn
GROUP BY c1;
这种是比较麻烦的一种,需要借助pl/sql:
原始数据:
CLASS1 CALLDATE CALLCOUNT
转置后:
------------ ---------- ---------- ----------
试验如下:
①.). 建立测试表和数据
CREATE TABLE t(
calldate DATE,
callcount INTEGER
);
INSERT INTO t(class1, calldate, callcount)
COMMIT ;
CREATE OR REPLACE PACKAGE pkg_getrecord
TYPE myrctype IS REF CURSOR;
END pkg_getrecord;
/
CREATE OR REPLACE FUNCTION fn_rs
RETURN pkg_getrecord.myrctype
CURSOR c1 IS
SELECT ',sum(case when Class1='
|| class1
|| ' then CallCount else 0 end)'
|| ' "CallCount'
FROM t
GROUP BY class1;
r1 c1%ROWTYPE;
list_cursor pkg_getrecord.myrctype;
s := 'select CallDate ';
OPEN c1;
LOOP
FETCH c1 INTO r1;
EXIT WHEN c1%NOTFOUND;
CLOSE c1;
s := s || ' from T group by CallDate order by CallDate desc ';
OPEN list_cursor FOR s;
RETURN list_cursor;
END fn_rs;
var results refcursor;
exec :results := fn_rs;
print results;
--------------- ---------- ---------- ----------
select 厂家,
sum(case when 列别 = 棉衣 then 1 else 0 end) 棉衣,
sum(case when 列别 = 风衣 then 1 else 0 end) 风衣 ,
sum(case when 列别 = 背心 then 1 else 0 end) 背心
from 表
group by 厂家
用C#实现矩阵的转置.
假设 原矩阵式 a是int [m,n],新定义一个二位数组b是int [n,m]
然后对每个b的元素b[x,y]赋值 a[y,x]
如果字段存的就是这个,那么这个应该是字符串吧,那么就分几步操作.
(1)定位,定位{和:的位置,从现在来看有两种可能,第一种
定位的函数应该是instr
还是那句话,如果是第二种可能,那么就要找每一个{的位置,然后找在{后面距离最近的冒号的位置,然后再一个个的截取操作,正则应该可以操作,不过我还是那句话,需要测试,意思和这个截取函数差不多,自己好好理解一下应该就能操作了.
一般行列转置,有两种做法
一种是case,但是由于case需要提前知道列数,所以在很多情况下不能满足
所以出现了动态语句case,通过动态SQL语句的组装,实现了动态的列的拼装.但是语句复杂度很高
所以另一种方式就是靠程序转置,使用一些Hash(JAVA)或Dictionary(C#)等一些对象,可以在程序中轻松地做出转置,但是也有缺点,缺点就是开销大,原本只处理一次的数据(只在数据库处理),现在需要处理两次(数据库一次,程序一次)
以上就是土嘎嘎小编为大家整理的Oracle转置怎么取相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!