试试下面语句:当天日期小于7月时取当年的第一天,当天日期大于6月时取7月的第一天。
创新互联公司长期为1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为偃师企业提供专业的成都网站建设、成都网站制作,偃师网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。
select case when to_char(sysdate,'mm')7 then trunc(sysdate,'YYYY') else
trunc(add_months(sysdate,-to_char(sysdate,'mm')+7),'mm') end from dual;
代码:
CREATE OR REPLACE PROCEDURE P_TESTB
AS
VARCURSOR SYS_REFCURSOR;
R USERS%ROWTYPE;
BEGIN
P_TESTA(VARCURSOR);
LOOP
FETCH VARCURSOR INTO R;
EXIT WHEN
VARCURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(R.NAME);
END LOOP;
END
P_TESTB;
oracle中sum分组取值/汇总值用如下方法。
如emp表中有如下数据:
现要按deptno分组,求每组中sal的值/汇总值,可用如下语句:
select deptno,sum(sal)/(select sum(sal) from emp) from emp group by deptno;
查询结果:
如果不都是这样的,也就是前面的去掉的部分不一致,那么可以通过substr(字段,instr(字段,'/',1,2)+1)这么来取,如果都是,‘浙江省电信公司/宁波市分公司/,那么直接查就好了。直接写为substr(字段,16)就行了
decode只是改变列的显示,需要结果为一行你需要增加where语句进行数据过滤。
一条SQL感觉实现不了,写一个块应该可以或者将数据查出来在程序里循环判断一下也行
DECLARE
V_NAME VARCHAR2(10) := '';
V_P2 NUMBER := 0;
BEGIN
FOR TEMP IN (SELECT A.NAME, A.P2, ROWNUM
FROM A
WHERE A.P1 0
ORDER BY A.NAME, A.P2)
LOOP
IF V_NAME = TEMP.NAME AND TEMP.P2 - V_P2 = 1 THEN
DBMS_OUTPUT.PUT_LINE(V_NAME || ' ' || V_P2);
DBMS_OUTPUT.PUT_LINE(TEMP.NAME || ' ' || TEMP.P2);
END IF;
V_NAME := TEMP.NAME;
V_P2 := TEMP.P2;
END LOOP;
END;