Oracle数据库单表循环提取输出
现在有如下的表,名称为Test表:
ydid sws_dm sws_mc ry_dm ry_mc
1 1 第一税务所 100 张飞
2 1 第一税务所 101 赵云
3 1 第一税务所 102 马超
4 1 第一税务所 103 黄忠
5 1 第一税务所 104 关羽
6 2 第二税务所 200 程昱
7 2 第二税务所 201 贾诩
8 2 第二税务所 202 郭嘉
9 2 第二税务所 203 荀彧
10 2 第二税务所 204 荀攸
11 3 第三税务所 300 司马懿
12 3 第三税务所 301 曹洪
13 3 第三税务所 302 曹仁
14 3 第三税务所 303 夏侯渊
15 3 第三税务所 304 阿速达
16 4 第四税务所 401 黄月英
17 4 第四税务所 402 庞统
18 4 第四税务所 403 马岱
19 4 第四税务所 404 刘备
20 5 第五税务所 500 陆逊
想形成如下的表结构,就是以sws_dm字段进行过滤,得出人员总数统计和人员名称:
sws_dm sws_mc ry_mc 总
1 第一税务所 张飞;赵云;马超;黄忠;关羽 5
2 第二税务所 程昱;贾诩;郭嘉;荀彧;荀攸 5
3 第三税务所 司马懿;曹洪;曹仁;夏侯渊;阿速达 5
4 第四税务所 黄月英;庞统;马岱;刘备 4
5 五税务所 陆逊 1
从上面,我们的出两种解决方法(在Oracle 11G中):
select sws_dm, sws_mc,
max(replace(substr(sys_connect_by_path(ry_mc, '*'), 2),'*',';')),count(*) 总人数
from(
select sws_dm, sws_mc,ry_mc,
dense_rank()over(order by sws_dm) + row_number()over(order by sws_dm) rid,
row_number() over (partition by sws_dm order by sws_dm) nid
from tab)
start with nid = 1
connect by prior rid = rid - 1
GROUP BY sws_dm,sws_mc;
在Oracle 10G中的语句如下:
select sws_dm, sws_mc, replace(wm_concat(ry_mc),',',';')ry_mc,count(*) 总人数
from tab
group by sws_dm, sws_mc;
然后另外一个方法就是利用SQL函数来解决:
具体做法如下:
create or replace FUNCTION JYH_ZHRY(BMID IN VARCHAR2)
---------------------------------------------------------------
--★ 将定位表里的数据转成单行
--★ WRITTEN BY XIASHITONG
---------------------------------------------------------------
RETURN VARCHAR2 IS
CURSOR C_ZBID IS
SELECT A.Ry_Mc || ';' Ry_Mc
FROM DB_QPGL.JYH_SYJKFK_YDQK A
WHERE A.Sws_Dm =BMID;
V_SQL VARCHAR2(5000) := '';
BEGIN
FOR C_R IN C_ZBID LOOP
V_SQL := V_SQL || C_R.Ry_Mc;
END LOOP;
IF V_SQL IS NOT NULL THEN
V_SQL := RTRIM(V_SQL, ',');
END IF;
RETURN V_SQL;
END;
然后在ORACLE中进行SQL语句的调用:
Select SWS_MC,COUNT(1),SWS_DM SL,DB_QPGL.JYH_ZHRY(SWS_DM) FROM DB_QPGL.JYH_SYJKFK_YDQK GROUP BY SWS_MC,SWS_DM
以下是转来的一片文章,大体上说明oracle的Function的运用:
方法一:帶入与表同形态的参数
CREATE OR REPLACE FUNCTION F_Get_Cust_Name (V_NO IN CUSTOMER.NO%TYPE,V_COMPNO IN CUSTOMER.COMPNO%TYPE)
RETURN CUSTOMER.NAME%TYPE
IS
V_NAME CUSTOMER.NAME%TYPE;
BEGIN
SELECT CUSTOMER.NAME INTO V_NAME
FROM CUSTOMER
WHERE
NO=V_NO AND COMPNO=V_COMPNO ;
RETURN V_NAME;
EXCEPTION WHEN NO_DATA_FOUND THEN RETURN ' '; ---錯誤回空白
END;
方法二:带入自定义类型的参数
CREATE OR REPLACE FUNCTION F_Get_Cust_Name (V_NO IN VARCHAR2,V_COMPNO IN VARCHAR2)
RETURN VARCHAR2
IS
V_NAME VARCHAR2;
BEGIN
SELECT CUSTOMER.NAME INTO V_NAME
FROM CUSTOMER
WHERE
NO=V_NO AND COMPNO=V_COMPNO ;
RETURN V_NAME;
EXCEPTION WHEN NO_DATA_FOUND THEN RETURN ' '; ---錯誤回空白
END;
例:
--1为正确登录
--2为密码不正确
--3为账户不存在
--返回数值型
create or replace function GetAccount(acc_id in MEMBERS.ACCOUNT_ID%type,acc_pwd in MEMBERS.ACCOUNT_PASSWORD%type)
return number
is
v_result number;
v_count number;
v_acc_pwd MEMBERS.ACCOUNT_PASSWORD%type;
begin
select count(*) as count, MEMBERS.ACCOUNT_PASSWORD into v_count,v_acc_pwd
from MEMBERS
where MEMBERS.ACCOUNT_ID=acc_id
group by MEMBERS.ACCOUNT_PASSWORD;
if v_count>0
then
if v_acc_pwd=acc_pwd then
v_result:=1;
else
v_result:=2;
end if;
else
v_result:=3;
end if;
return v_result;
EXCEPTION WHEN NO_DATA_FOUND THEN RETURN 3;
end;
Oracle数据库单表循环提取输出的更多相关文章
- oracle数据库单表查询
今天给大家分享的是关于数据库的单表查询,像单表查询/多表查询/分组查询/子查询,这些方法的使用在实际项目过程中会经常用到,作为一名合格的测试人员如果不会数据库那肯定是不行的,行走江湖可能随时会面临被侮 ...
- Mariadb/MySQL数据库单表查询基本操作及DML语句
Mariadb/MySQL数据库单表查询基本操作及DML语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一数据库及表相关概述 1>.数据库操作 创建数据库: CREATE ...
- WPF根据Oracle数据库的表,生成CS文件小工具
开发小工具的原因: 1.我们公司的开发是客户端用C#,服务端用Java,前后台在通讯交互的时候,会用到Oracle数据库的字段,因为服务器端有公司总经理开发的一个根据Oracle数据库的表生成的cla ...
- oracle查询单表占用空间的大小
oracle查询单表占用空间的大小 SELECT segment_name AS TABLENAME, BYTES B, BYTES KB, BYTES MB FROM user_segments w ...
- 定时从远程的数据库中取数据,然后把取出来的数据插入或更新本地的oracle数据库的表
最近项目中有一种需求: 大致需求是这样的 通过给定的 用户名和密码 要定时从远程的数据库中取数据,然后把取出来的数据插入或更新本地的oracle数据库的表 项目的结构式struts1 hibernat ...
- PowerDesigner连接Oracle数据库建表序列号实现自动增长
原文:PowerDesigner连接Oracle数据库建表序列号实现自动增长 创建表就不说了.下面开始介绍设置自动增长列. 1 在表视图的列上创建.双击表视图,打开table properties — ...
- Oracle 数据库整理表碎片
Oracle 数据库整理表碎片 转载:http://kyle.xlau.org/posts/table-fragmentation.html 表碎片的来源 当针对一个表的删除操作很多时,表会产生大量碎 ...
- mysql数据库单表只有一个主键自增id字段,ibatis实现id自增
mysql数据库单表只有一个主键自增id字段,ibatis实现id自增 <insert id="autoid"> insert into user_id ...
- Oracle数据库创建表是有两个约束带有默认索引
Oracle数据库创建表是有两个约束带有默认索引.1.主键primary Key:唯一索引.非空2.唯一Unique:唯一索引,可以是空值如果没有设定主键和唯一约束,表中不会有默认索引的. 建立主键/ ...
随机推荐
- bzoj3631 [JLOI2014]松鼠的新家——树上差分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3631 树上差分:注意路径的结尾被多算了一次,最后要减去(不能提前减). 代码如下: #inc ...
- vue 生命周期钩子 过滤器 计算属性
每一个Vue实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测.编译模板.挂载实例到DOM,然后在数据变化时更新DOM,在这个过程中,实例也会调用一些生命周期钩子,这就给我们提供了 ...
- UI:sqlite数据库
使用sqllite的时候一些笔记 数据库(管理类),在工程 general 导入 动态链接库 libsqllite3.0.dylib 在.h文件里引入导入 sqllite3.h 头文件 在.h里面声 ...
- Oracle:ORA-12154: TNS:could not resolve the connect identifier specified
ORA-12154: TNS: 无法解析指定的连接标识符 注册表:regedit 安装oracle后用Net Manager 配置好服务名称之后,测试成功,可是PL/SQL无法连接 http://we ...
- bzoj 2229: [Zjoi2011]最小割【Gomory–Hu tree最小割树】
这个算法详见http://www.cnblogs.com/lokiii/p/8191573.html 求出两两之间最小割之后暴力统计即可 #include<iostream> #inclu ...
- CentOS 7安装并设置启动图形桌面
服务器端有时没有安装图形桌面,采用下面的步骤安装gnome桌面,并能够启动后进入图形桌面 1.安装图形环境 #yum grouplist#yum groupinstall 'GNOME Desktop ...
- 30行JavaScript代码实现一个比特币量化策略
精简极致的均线策略 30行打造一个正向收益系统 原帖地址:https://www.fmz.com/bbs-topic-new/262 没错!你听的没错是30行代码!仅仅30行小编我习惯先通篇来看看 代 ...
- Luogu P1233 木棍加工 【贪心/LIS】
题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间为1分钟: 如果刚处理 ...
- [BZOJ1382]Mars Maps
Description In the year 2051, several Mars expeditions have explored different areas of the red plan ...
- 牛客网暑期ACM多校训练营(第五场)
J-plan(贪心) 题目描述 There are n students going to travel. And hotel has two types room:double room and t ...