-----------------存储过程包体-----------

procedure GetComparativeAnalysisTB(p_StartTime varchar2, ----开始时间
p_EndTime varchar2, ----结束时间
p_type varchar2, ----1:按全市2:按行业3、按企业
p_id varchar2, ----1全部 、区县编码或企业名称
p_id1 varchar2, ----按企业查询p_id为区县p_id1为企业编码
c_Select in out REF_WFData)
is
cursor cursor_1 IS
---获取 时间段年份
SELECT (to_number(to_char(TO_DATE(p_StartTime, 'yyyy-MM'), 'YYYY')) + ROWNUM-1) AS Yearlist
FROM DUAL
CONNECT BY ROWNUM <= (to_char(to_date(p_EndTime, 'yyyy-MM'),'yyyy')-to_char(to_date(p_StartTime, 'yyyy-MM'),'yyyy'))+1
order by Yearlist desc;
V_SQL VARCHAR2(32767);
/* aYear varchar2(200);---获取年*/
bMonth varchar2(200);---获取月
v_StartTime varchar2(200); ---- 开始时间
v_EndTime varchar2(200); ----结束时间
begin
v_StartTime:=p_StartTime||'-01';
v_EndTime:=p_EndTime||'-01';
if p_type=1 then ---统计类别---- 按全市
V_SQL := 'select t1.ps_code,t1.ps_name';
FOR V_XCLCK IN cursor_1
LOOP
SELECT to_char(substr(p_StartTime,6,instr(p_StartTime,'-')-3)) into bMonth FROM DUAL ;--获取月
V_SQL := V_SQL ||','|| 'min(case when to_char(t1.ps_month,''yyyy-mm'')=''' || V_XCLCK.Yearlist||'-'|| bMonth||''' then t1.pfl end) as ' || 'pfl'||V_XCLCK.Yearlist||bMonth||','
|| 'min(case when to_char(t1.ps_month,''yyyy-mm'')=''' || V_XCLCK.Yearlist||'-'|| bMonth||''' then t1.fqpfl end) as ' || 'fqpfl'||V_XCLCK.Yearlist||bMonth;
END LOOP;
V_SQL := V_SQL || ' from (
select
a.ps_month,
a.c0008_pid ps_code,
a.c0008_item_desc ps_name,
b.ps_pfl fqpfl,
sum(nvl(a.ps_pfl,0)) pfl
from PSINFO_OUTPUTSUBPFYZ_SB a,PSINFO_OUTPUTSUB_SB b
where a.c0003_stcode=b.c0003_stcode
and a.c0070_enterprise_code=b.c0070_enterprise_code
and a.c0007_pcode=b.c0007_pcode
and a.ps_month=b.ps_month
and a.ps_month>=to_date('''||v_StartTime||''',''yyyy-mm-dd'')
and a.ps_month<=to_date('''||v_EndTime||''',''yyyy-mm-dd'')
and a.c0008_pid in (201,203,207)
and a.ps_state=1
group by a.c0008_pid,a.c0008_item_desc,a.ps_month,b.ps_pfl
) t1
group by ps_code,ps_name
order by ps_code';
DBMS_OUTPUT.PUT_LINE(V_SQL);
open c_Select for V_SQL;
end if;
end GetComparativeAnalysisTB;

效果图:确定好年份,就会动态循环列头。

————————————————————动态月份列,效果图:显示到具体月份——————————————————————————

cursor cursor_1 IS
---获取 时间段月份
SELECT TO_CHAR(ADD_MONTHS(TO_DATE(p_StartTime, 'yyyy-MM'), ROWNUM - 1), 'yyyy-MM') as monthlist
FROM DUAL
CONNECT BY ROWNUM <= months_between(to_date(p_EndTime, 'yyyy-MM'),to_date(p_StartTime, 'yyyy-MM')) + 1 ;
V_SQL VARCHAR2(32767);
aYear varchar2(200);---获取年
bMonth varchar2(200);---获取月
v_StartTime varchar2(200); ---- 开始时间
v_EndTime varchar2(200); ----结束时间
begin
v_StartTime:=p_StartTime||'-01';
v_EndTime:=p_EndTime||'-01';
if p_type=1 then ---统计类别---- 按全市
if p_id='0' then
V_SQL := 'select t1.ps_code,t1.ps_name';
FOR V_XCLCK IN cursor_1
LOOP
SELECT to_char(substr(V_XCLCK.monthlist,1,instr(V_XCLCK.monthlist,'-')-1)),to_char(substr(V_XCLCK.monthlist,6,instr(V_XCLCK.monthlist,'-')-3)) into aYear,bMonth FROM DUAL ;
V_SQL := V_SQL ||','|| 'nvl(min(case when to_char(t1.ps_month,''yyyy-mm'')=''' || V_XCLCK.monthlist||''' then t1.pfl end),0) as ' || 'pfl'||aYear||bMonth||','
|| 'nvl(min(case when to_char(t1.ps_month,''yyyy-mm'')=''' || V_XCLCK.monthlist||''' then t1.fqpfl end),0) as ' || 'fqpfl'||aYear||bMonth;
END LOOP;
V_SQL := V_SQL || ' from (
select
a.ps_month,
a.c0008_pid ps_code,
a.c0008_item_desc ps_name,
b.ps_pfl fqpfl,
sum(nvl(a.ps_pfl,0)) pfl
from PSINFO_OUTPUTSUBPFYZ_SB a,PSINFO_OUTPUTSUB_SB b
where a.c0003_stcode=b.c0003_stcode
and a.c0070_enterprise_code=b.c0070_enterprise_code
and a.c0007_pcode=b.c0007_pcode
and a.ps_month=b.ps_month
and a.ps_month>=to_date('''||v_StartTime||''',''yyyy-mm-dd'')
and a.ps_month<=to_date('''||v_EndTime||''',''yyyy-mm-dd'')
and a.c0008_pid in (201,203,207)
and a.ps_state=1
group by a.c0008_pid,a.c0008_item_desc,a.ps_month,b.ps_pfl
) t1
group by ps_code,ps_name
order by ps_code';
DBMS_OUTPUT.PUT_LINE(V_SQL);
open c_Select for V_SQL;

oracle 行转列,动态年份,月份列。已解决!的更多相关文章

  1. Oracle 行转列 动态出转换的列

    本文链接:https://blog.csdn.net/Huay_Li/article/details/82924443 10月的第二天,前天写了个Oracle中行转列的pivot的基本使用方法,然后, ...

  2. Oracle 行转列pivot 、列转行unpivot 的Sql语句总结

    这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ...

  3. Oracle行转列、列转行的Sql语句总结

    多行转字符串 这个比较简单,用||或concat函数可以实现  SQL Code  12    select concat(id,username) str from app_userselect i ...

  4. Oracle行转列、列转行的Sql语句总结(转)

    多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_userselect id||username str f ...

  5. oracle 行转列 分析函数

    oracle 行转列 首先看一下源数据: 方法一:WM_CONCAT group by 这个方法没有问题. SELECT CODE_TS, WMSYS.WM_CONCAT(S_NUM + || ':' ...

  6. oracle行转列,列转行

    多行转字符串这个比较简单,用||或concat函数可以实现 SQL Code select concat(id,username) str from app_userselect id||userna ...

  7. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  8. Oracle行转列,pivot函数和unpivot函数

    pivot函数:行转列函数: 语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值)):unpivot函数:列转行函数: 语法:unpivot(新增值所在列的列名 for ...

  9. Oracle 行转列小结

    近期在工作中.对行转列进行了应用,在此做一个简单的小结. 转换步骤例如以下:     1.创建表结构 CREATE TABLE RowToCol ( ID NUMBER(10) not null, U ...

  10. Oracle行转列,列转行,行列相互转换

    1.行转列 SELECT WM_CONCAT(COLUMN_NAME) COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'T_CREATE_T ...

随机推荐

  1. python之路35 MySQL 3 字段的约束条件 外键关系

    字段约束条件 无符号.零填充 unsigned id int unsigned zerofill id int(5) zerofill 非空 create table t1( id int, name ...

  2. A排列方案

    递归实现排列型枚举 把 1∼n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序. 输入格式 一个整数 n. 输出格式 按照从小到大的顺序输出所有方案,每行 1 个. 首先,同一行相邻两个数用 ...

  3. [Java]内存回收机制框架图

    具体解释下面这篇博客总结的已经非常好了,我就不复制了: http://www.cnblogs.com/cielosun/p/6674431.html#12-%E5%8F%AF%E8%BE%BE%E6% ...

  4. windows系统批量转换CRLF和LF格式代码,解决eslint报错Delete `␍`解决'unix2dos' is not recognized as an internal or external command

    每天都要开心(▽)哇: 最近写代码,工程配置为lf格式,但是拉取代码后,代码都变成了CRLF,于是满屏幕报错 在做跨平台开发移植的时候,最常见的问题就是不同操作系统的换行不同(例如,Windows 上 ...

  5. 移动端微信小程序开发学习报错记录--toast.js:41 未找到 van-toast 节点,请确认 selector 及 context 是否正确

    这个问题仔细检查了一下代码引入,是没有问题的, 根本原因是在页面上忘了加<van-toast id="van-toast" /> 具体引入代码如下: app.json ...

  6. Java基础1-1-4—java基础语法(循环+随机数)

    4.循环+随机数 4.1 循环语句-for循环 循环 特征:1.重复做某件事情 2.具有明确的开始和停止标志 for循环格式介绍 public static void main(String[] ar ...

  7. DML_添加数据-DML_删除数据

    DML_添加数据 添加数据 语法 : insert into 表名(列名1,列名2,...列名n) values (值1,值2,... 值n); 注意: 1.列名和值要一一对应. 2.如果表名后,不定 ...

  8. Java入门与进阶 P4.1+P4.2

    表达积累的结果应该初始化为1 for循环 for循环像一个计数循环:设定一个计数器,初始化它,然后再计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步骤进行调整,比如加 i 或者减 ...

  9. 行为型模式 - 备忘录模式Memento

    学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 模式的定义与特点 在备忘录模式(Memento Pattern)下,为的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该 ...

  10. 简单了解C语言如何构建多文件项目

    简单理解C语言如何构建工程 首先我们最好有一个好用的编辑器,vscode也好,visual studio也罢,dev也行,这里我们使用的是code::block: 一.了解C语言工程的构建原理 ​ 首 ...