
可以用wm_concat函数先把数据变成行显示,然后再通过截取来显示具体的月份,wm_concat转换如下
select compay_name cn, wm_concat(income) icfrom (select compay_name, sum(income) income, substr(time, 1, 6) time
from income
---where time >=start_month and time <= end_month
group by compay_name, substr(time, 1, 6)
order by compay_name, substr(time, 1, 6))
group by compay_name;
这个要存储过程了。
CREATE OR REPLACE PROCEDURE P_TEST ISV_SQL VARCHAR2(2000);
CURSOR CURSOR_1 IS SELECT DISTINCT TXCLCK FROM TEST T ORDER BY XCLCK;
BEGIN
V_SQL := 'SELECT WL,XYSL,XYCK';
FOR V_XCLCK IN CURSOR_1
LOOP
V_SQL := V_SQL || ',' || 'SUM(DECODE(XCLCK,''' || V_XCLCKXCLCK ||
''',XCLCKSL,0)) AS ' || V_XCLCKXCLCK;
END LOOP;
V_SQL := V_SQL || ' FROM TEST GROUP BY WL,XYSL,XYCK ORDER BY WL,XYSL,XYCK';
--DBMS_OUTPUTPUT_LINE(V_SQL);
V_SQL := 'CREATE OR REPLACE VIEW RESULT AS '|| V_SQL;
--DBMS_OUTPUTPUT_LINE(V_SQL);
EXECUTE IMMEDIATE V_SQL;
END;
然后
BEGIN
P_TEST;
END;
对了这是表:----------------建表
CREATE TABLE TEST(
WL VARCHAR2(10),
XYSL INTEGER,
XYCK VARCHAR2(10),
XCLCK VARCHAR2(10),
XCLCKSL INTEGER,
PC INTEGER
);
我给你写个例子,你看着我的例子来。
select from tbname;行转列之后的数据:
select pud, listagg(ud, ',') within group(order by null) as udfrom tbname
group by pud;
select
sum(decode(name, '苹果' Price,null)) as 苹果,
sum(decode(name, '香蕉 Price,null)) as 香蕉,
from a
这样
-----------------
select ID,'Data1' as Data1,'Data2' as Data2,X1 from A
union all
select ID,'Data3' as Data1,'Data4' as Data2,X2 from A
union all
以上就是关于oracle行转列写法,麻烦大家帮忙写个sql,谢谢全部的内容,包括:oracle行转列写法,麻烦大家帮忙写个sql,谢谢、关于Oracle不定行转列的问题、oracle 行转列,列名不固定,求指导。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)