现在有如下的表,名称为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数据库单表循环提取输出的更多相关文章

  1. oracle数据库单表查询

    今天给大家分享的是关于数据库的单表查询,像单表查询/多表查询/分组查询/子查询,这些方法的使用在实际项目过程中会经常用到,作为一名合格的测试人员如果不会数据库那肯定是不行的,行走江湖可能随时会面临被侮 ...

  2. Mariadb/MySQL数据库单表查询基本操作及DML语句

    Mariadb/MySQL数据库单表查询基本操作及DML语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一数据库及表相关概述 1>.数据库操作 创建数据库: CREATE ...

  3. WPF根据Oracle数据库的表,生成CS文件小工具

    开发小工具的原因: 1.我们公司的开发是客户端用C#,服务端用Java,前后台在通讯交互的时候,会用到Oracle数据库的字段,因为服务器端有公司总经理开发的一个根据Oracle数据库的表生成的cla ...

  4. oracle查询单表占用空间的大小

    oracle查询单表占用空间的大小 SELECT segment_name AS TABLENAME, BYTES B, BYTES KB, BYTES MB FROM user_segments w ...

  5. 定时从远程的数据库中取数据,然后把取出来的数据插入或更新本地的oracle数据库的表

    最近项目中有一种需求: 大致需求是这样的 通过给定的 用户名和密码 要定时从远程的数据库中取数据,然后把取出来的数据插入或更新本地的oracle数据库的表 项目的结构式struts1 hibernat ...

  6. PowerDesigner连接Oracle数据库建表序列号实现自动增长

    原文:PowerDesigner连接Oracle数据库建表序列号实现自动增长 创建表就不说了.下面开始介绍设置自动增长列. 1 在表视图的列上创建.双击表视图,打开table properties — ...

  7. Oracle 数据库整理表碎片

    Oracle 数据库整理表碎片 转载:http://kyle.xlau.org/posts/table-fragmentation.html 表碎片的来源 当针对一个表的删除操作很多时,表会产生大量碎 ...

  8. mysql数据库单表只有一个主键自增id字段,ibatis实现id自增

    mysql数据库单表只有一个主键自增id字段,ibatis实现id自增 <insert id="autoid">        insert into user_id ...

  9. Oracle数据库创建表是有两个约束带有默认索引

    Oracle数据库创建表是有两个约束带有默认索引.1.主键primary Key:唯一索引.非空2.唯一Unique:唯一索引,可以是空值如果没有设定主键和唯一约束,表中不会有默认索引的. 建立主键/ ...

随机推荐

  1. artemplate include

    include用于嵌入字模板 {{include 'template_name'}} 子模板 默认共享当前的数据 也可以自己指定数据 {{include 'template_name' templat ...

  2. maven项目没有错,但是在项目头上有红叉的解决方法

    转自:https://blog.csdn.net/myblog_dhy/article/details/41695107 我在使用maven的过程中,要导入某个maven项目,导入的过程中会弹出一个框 ...

  3. 记bugku的——“welcome to bugkuctf”

    今天终于拾起来ctf的比赛了,开始了练习之旅.今天写一道bugku上的题目wp,属于利用php源码泄漏的题目吧,我觉得不是很简单...所以把自己的思路放上来. 题目源头:http://120.24.8 ...

  4. SGU 176 Flow construction【有上下界最小流】

    正好考到了所以翻一些题来做--猛然发现搞了半个月的网络流却没做两道上下界(不过这种题好像是比较少233) 首先建立超级源汇ss,tt,没限制的边照常连,对于有限制的边(u,v,mn,mx),连接(u, ...

  5. P3755 [CQOI2017]老C的任务

    传送门 可以离线,把询问拆成四个,然后把所有的按\(x\)坐标排序,这样就只要考虑\(y\)坐标了.然后把\(y\)坐标离散化,用树状数组统计即可 记得开longlong //minamoto #in ...

  6. ————————C语言中快速排序方法——————————————

    在对浮点型排序是一定要用三木运算符(三目运算符内容下去自己看),因为如果也是用整形那样的减法的时候如果是两个十分相近的数字 可能返回一个小数(自己一会去试试),冉冉他cmp返回值是int(试试别的)因 ...

  7. 安装 Apache Commons Logging API步骤

    下载地址:  http://commons.apache.org/logging/ 

  8. ROS学习笔记五:创建和使用ROS msg和srv

    1 msg和srv简介 1.1 msg文件 msg文件就是一个简单的text文件,其中每行有一个类型和名称,可用的类型如下: int8, int16, int32, int64 (plus uint* ...

  9. 一步一步学习GTK

    完成课设,偶然碰到GTK,索性学习一遍 转载自ikoDotA の BLOG (一).一步一步学GTK+之开篇 一.什么是GTK+ GTK+ 是一种函数库是用来帮助制作图形交互界面的.整个函数库都是由C ...

  10. C#扩展方法学习

    扩展方法的本质是什么,详细见此文 C#扩展方法,爱你在心口难开 重点如下:扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法 ...