当前位置:首页 » 编程语言 » oracle报表sql
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

oracle报表sql

发布时间: 2022-08-19 23:07:27

1. oracle 利用 分组求和一张报表的 字段 金额 sql

select decode(t.f_disqua_level,'1','A类','2','B类','3','C类','4','D类','') as 等级, t.f_process as 发现地点, t.f_discovery_time as 发现时间, t.f_description as 不合格描述, b.f_tydept as 责任部门, b.f_assess_multiple as 考核倍数, b.f_assess_sum as 金额(元), c.sum_count as 部门合计
from t_quality_dis_process t,t_quality_dis_tydept b,
(select a.f_tydept,
sum(a.f_assess_sum) OVER(PARTITION BY a.f_assess_sum) sum_count
from t_quality_dis_tydept a
group by a.f_tydept) c
where t.f_status=4
and b.f_disqua_id=t.f_id
and to_char(t.f_discovery_time,'yyyymm') between '201503' and '201503'
and c.f_tydept = b.f_tydept
order by t.f_discovery_time

2. ORACLE PL/SQL问题解决

终于做完了,很辛苦的,多给点分哈~~
Q1:
COL DEPTNO FORM 999
COL DNAME FORM A15
SELECT NVL(A.DEPTNO,100) DEPTNO,NVL(B.DNAME,'SUM') DNAME,A.人数,A."SUM"
FROM
(select deptno,count(ename) 人数,SUM(SAL) "SUM" from emp group by rollup(deptno)) A
LEFT JOIN DEPT B
ON A.DEPTNO=B.DEPTNO
ORDER BY 1
;

DEPTNO DNAME 人数 SUM
------ --------------- ---------- ----------
10 ACCOUNTING 3 8750
20 RESEARCH 5 10875
30 SALES 6 9400
100 SUM 14 29025

Q2:
SQL> CREATE SEQUENCE SEQ_TAB1;

序列已创建。

SQL> CREATE OR REPLACE TRIGGER TRG_TAB1
2 BEFORE INSERT ON TABLE1
3 FOR EACH ROW
4 BEGIN
5 SELECT SEQ_TAB1.NEXTVAL INTO :NEW.ID FROM DUAL;
6 END;
7 /

触发器已创建

SQL> INSERT INTO TABLE1(NAME,ADDRESS) VALUES('AAA','ABC');

已创建 1 行。

SQL> COL NAME FORM A10
SQL> COL ADDRESS FORM A10
SQL> SELECT * FROM TABLE1;

ID NAME ADDRESS
---------- ---------- ----------
1 AAA ABC

SQL> CREATE TABLE TABLE2(ID NUMBER,
2 CATEGORY CHAR(1) CHECK(CATEGORY IN ('A','B','C')),
3 FRIEND VARCHAR2(50),
4 FOREIGN KEY(ID) REFERENCES TABLE1(ID));

表已创建。

SQL> INSERT INTO TABLE2 VALUES(2,'A','BB');
INSERT INTO TABLE2 VALUES(2,'A','BB')
*
第 1 行出现错误:
ORA-02291: 违反完整约束条件 (SCOTT.SYS_C005786) - 未找到父项关键字

SQL> INSERT INTO TABLE2 VALUES(1,'A','BB');

已创建 1 行。

SQL> INSERT INTO TABLE2 VALUES(1,'D','CC');
INSERT INTO TABLE2 VALUES(1,'D','CC')
*
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (SCOTT.SYS_C005785)

SQL> INSERT INTO TABLE2 VALUES(1,'B','CC');

已创建 1 行。

SQL> COL FRIEND FORM A10
SQL> SELECT * FROM TABLE2;

ID CA FRIEND
---------- -- ----------
1 A BB
1 B CC

SQL> CREATE VIEW V_FRIENDS AS
2 SELECT A.NAME,B.CATEGORY,B."COUNT"
3 FROM TABLE1 A
4 INNER JOIN (SELECT ID,CATEGORY,COUNT(DISTINCT FRIEND) "COUNT"
5 FROM TABLE2
6 GROUP BY ID,CATEGORY) B
7 ON A.ID=B.ID
8 /

视图已创建。

SQL> SELECT * FROM V_FRIENDS;

NAME CA COUNT
---------- -- ----------
AAA A 1
AAA B 1

Q3:可修改中文输出形式

CREATE OR REPLACE FUNCTION FUNC_CHN_NUM(V_NUM NUMBER)
RETURN VARCHAR2
IS
V_FLAG NUMBER:=0;
V_OUT VARCHAR2(10);
V_OUTSTR VARCHAR2(200);
V_LEN NUMBER;
BEGIN
SELECT LENGTH(V_NUM) INTO V_LEN FROM DUAL;
IF V_LEN>12
THEN RETURN '超出选值范围!';--到千亿
ELSE
WHILE V_FLAG<V_LEN
LOOP
-- SUBSTR(V_NUM,LENGTH(V_NUM)-V_FLAG,1) into v_out FROM DUAL;
SELECT DECODE(SUBSTR(V_NUM,LENGTH(V_NUM)-V_FLAG,1),0,'零',1,'壹',2,'贰',3,'叁',4,'肆',5,'伍',6,'陆',7,'柒',8,'捌',9,'玖') INTO V_OUT FROM DUAL;
IF MOD(V_FLAG,4)=1 THEN V_OUT:=V_OUT||'拾'; END IF;
IF MOD(V_FLAG,4)=2 THEN V_OUT:=V_OUT||'佰'; END IF;
IF MOD(V_FLAG,4)=3 THEN V_OUT:=V_OUT||'仟'; END IF;
IF V_FLAG=0 THEN V_OUT:=V_OUT||'个'; END IF;
IF V_FLAG=4 THEN V_OUT:=V_OUT||'万'; END IF;
IF V_FLAG=8 THEN V_OUT:=V_OUT||'亿'; END IF;
V_OUTSTR:=V_OUT||V_OUTSTR;
V_FLAG:=V_FLAG+1;
End LOOP;
V_OUTSTR:=REPLACE(V_OUTSTR,'零拾','零');
V_OUTSTR:=REPLACE(V_OUTSTR,'零佰','零');
V_OUTSTR:=REPLACE(V_OUTSTR,'零仟','零');
V_OUTSTR:=REPLACE(V_OUTSTR,'零零','零');
V_OUTSTR:=REPLACE(V_OUTSTR,'零零','零');
V_OUTSTR:=REPLACE(V_OUTSTR,'零万','万');
V_OUTSTR:=REPLACE(V_OUTSTR,'零亿','亿');
V_OUTSTR:=REPLACE(V_OUTSTR,'亿万','亿');
V_OUTSTR:=REPLACE(V_OUTSTR,'零零','零');
V_OUTSTR:=REPLACE(V_OUTSTR,'壹拾','拾');
V_OUTSTR:=REPLACE(V_OUTSTR,'零个','个');
V_OUTSTR:=REPLACE(V_OUTSTR,'个','');
RETURN V_OUTSTR;
END IF;
END;

测试:

SQL> SELECT FUNC_CHN_NUM(03100000780) FROM DUAL;

FUNC_CHN_NUM(03100000780)
------------------------------------------------

叁拾壹亿零柒佰捌拾

SQL> SELECT FUNC_CHN_NUM(12345678910123) FROM DUAL;

FUNC_CHN_NUM(12345678910123)
---------------------------------------------------

超出选值范围!

SQL> SELECT FUNC_CHN_NUM(300000000008) FROM DUAL;

FUNC_CHN_NUM(300000000008)
-------------------------------------------------

叁仟亿零捌

SQL> SELECT FUNC_CHN_NUM(300007000008) FROM DUAL;

FUNC_CHN_NUM(300007000008)
-------------------------------------------------

叁仟亿零柒佰万零捌

SQL> SELECT FUNC_CHN_NUM(300007000018) FROM DUAL;

FUNC_CHN_NUM(300007000018)
-------------------------------------------------

叁仟亿零柒佰万零拾捌

SQL> SELECT FUNC_CHN_NUM(300007000010) FROM DUAL;

FUNC_CHN_NUM(300007000010)
-------------------------------------------------

叁仟亿零柒佰万零拾

SQL> SELECT FUNC_CHN_NUM(300007000100) FROM DUAL;

FUNC_CHN_NUM(300007000100)
-------------------------------------------------

叁仟亿零柒佰万零壹佰

SQL> SELECT FUNC_CHN_NUM(300007001000) FROM DUAL;

FUNC_CHN_NUM(300007001000)
-------------------------------------------------

叁仟亿零柒佰万壹仟

Q4:

SQL> CREATE TABLE TEST(日期 DATE, 收入 NUMBER(8),支出 NUMBER(8));

表已创建。

SQL> INSERT INTO TEST VALUES(TO_DATE('2000/3/1','YYYY/MM/DD'),50,30);

已创建 1 行。

SQL> INSERT INTO TEST VALUES(TO_DATE('2000/3/2','YYYY/MM/DD'),45,60);

已创建 1 行。

SQL> INSERT INTO TEST VALUES(TO_DATE('2000/3/5','YYYY/MM/DD'),60,10);

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT TO_CHAR(日期,'YYYY/MM/DD') 日期,收入,支出 FROM TEST;

日期 收入 支出
---------- ---------- ----------
2000/03/01 50 30
2000/03/02 45 60
2000/03/05 60 10

Q4-1:

SQL> SELECT A.日期,收入,支出,SUM(A.余额) OVER(ORDER BY A.日期) 余额
2 FROM
3 (SELECT TO_CHAR(日期,'YYYY/MM/DD') 日期,
4 SUM(收入) 收入,
5 SUM(支出) 支出,
6 SUM(收入)-SUM(支出) 余额
7 FROM TEST
8 GROUP BY TO_CHAR(日期,'YYYY/MM/DD')
9 ) A;

日期 收入 支出 余额
---------- ---------- ---------- ----------
2000/03/01 50 30 20
2000/03/02 45 60 5
2000/03/05 60 20 55

Q4-2:

SQL> INSERT INTO TEST VALUES(TO_DATE('2000/3/5','YYYY/MM/DD'),60,10);

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT A.日期,收入,支出,SUM(A.余额) OVER(ORDER BY A.日期) 余额
2 FROM
3 (SELECT TO_CHAR(日期,'YYYY/MM/DD') 日期,
4 SUM(收入) 收入,
5 SUM(支出) 支出,
6 SUM(收入)-SUM(支出) 余额
7 FROM TEST
8 GROUP BY TO_CHAR(日期,'YYYY/MM/DD')
9 ) A;

日期 收入 支出 余额
---------- ---------- ---------- ----------
2000/03/01 50 30 20
2000/03/02 45 60 5
2000/03/05 120 20 105

Q4-3:

SQL> SELECT
2 TO_CHAR(B.日期,'YYYY/MM/DD') 日期,
3 NVL(A.收入,0) 收入,
4 NVL(A.支出,0) 支出,
5 SUM(A.余额) OVER(ORDER BY B.日期) 余额
6 FROM
7 (
8 SELECT 日期,
9 SUM(收入) 收入,
10 SUM(支出) 支出,
11 SUM(收入)-SUM(支出) 余额
12 FROM TEST
13 GROUP BY 日期
14 ) A
15 RIGHT JOIN
16 (
17 SELECT (SELECT MIN(日期) FROM TEST)+ROWNUM-1 日期
18 FROM DUAL
19 CONNECT BY ROWNUM<(SELECT MAX(日期)-MIN(日期) FROM TEST)
20 ) B
21 ON A.日期=B.日期;

日期 收入 支出 余额
---------- ---------- ---------- ----------
2000/03/01 50 30 20
2000/03/02 45 60 5
2000/03/03 0 0 5
2000/03/04 0 0 5

--如果要看5号的余额,修改CONNECT BY ROWNUM<(SELECT MAX(日期)-MIN(日期) FROM TEST)成CONNECT BY ROWNUM<(SELECT MAX(日期)-MIN(日期)+1 FROM TEST)
SQL> SELECT
2 TO_CHAR(B.日期,'YYYY/MM/DD') 日期,
3 NVL(A.收入,0) 收入,
4 NVL(A.支出,0) 支出,
5 SUM(A.余额) OVER(ORDER BY B.日期) 余额
6 FROM
7 (
8 SELECT 日期,
9 SUM(收入) 收入,
10 SUM(支出) 支出,
11 SUM(收入)-SUM(支出) 余额
12 FROM TEST
13 GROUP BY 日期
14 ) A
15 RIGHT JOIN
16 (
17 SELECT (SELECT MIN(日期) FROM TEST)+ROWNUM-1 日期
18 FROM DUAL
19 CONNECT BY ROWNUM<(SELECT MAX(日期)-MIN(日期)+1 FROM TEST)
20 ) B
21 ON A.日期=B.日期;

日期 收入 支出 余额
---------- ---------- ---------- ----------
2000/03/01 50 30 20
2000/03/02 45 60 5
2000/03/03 0 0 5
2000/03/04 0 0 5
2000/03/05 120 20 105

3. ORACLE建表SQL

每个字段后面必须得跟字段的大小。
例如:create table student( name varchar2(20), age number(4), sal number(4), comm number(4), job varchar(4));
不然的话提示错误为:缺失左括号。
希望能够帮你。

4. 关于Oracle中的SQL生成统计表

select a.CostRegisterNo 编号,a.TopicNo 项目号,sum(nvl(a.bjf,0)) 编校费,sum(nvl(a.ysf,0)) 印刷费,sum(nvl(a.zbf,0)) 制版费
from
(select CostRegisterNo,
TopicNo,
sum(case when CostName='编校费' then CostAmt end) bjf,
sum(case when CostName='印刷费' then CostAmt end) ysf,
sum(case when CostName='制版费' then CostAmt end) zbf
from t group by CostRegisterNo,
TopicNo) a
group by a.CostRegisterNo ,a.TopicNo ;

---补充---
select a.CostRegisterNo 编号,a.TopicNo 项目号,
sum(nvl(a.bjf,0)) 编校费,sum(nvl(a.ysf,0)) 印刷费,sum(nvl(a.zbf,0)) 制版费
from
(select CostRegisterNo,
TopicNo,
sum(decode(CostName,'编校费', CostAmt)) bjf,
sum(decode(CostName,'印刷费', CostAmt)) ysf,
sum(decode(CostName,'制版费', CostAmt)) zbf
from t group by CostRegisterNo,
TopicNo) a
group by a.CostRegisterNo ,a.TopicNo ;

表名我定义的是t,你可以换一下
这里用了个nvl函数,这个主要的意思就是将查询出来的结果为空的转成0

5. 查询oracle数据库所有表sql语句怎么写

查询系统表:select * from all_tables where table_name not in (select table_name from user_tables);
查询用户表:select * from user_tables;

6. oracle中如何通过已有的表生成相关sql语句

最简单的方法,通过第三方工具plsql。

步骤:

1、登录表所在数据库及用户。

7. 怎么用sql语句查看oracle数据库里的所有表

可以从表user_tables中查询。
select
sum(num_rows)
from
user_tables
;
就是显示用户所有表的行数其中num_rows是每个表的行数,用sum加总一下,就是当前用户所有表的总行数。
但因为user_tables中的数据不是实时统计,会有时间差,所以以上sql统计得到的结果与实际会存在一定误差。