--创建用户
CREATE USER jim IDENTIFIED BY changeit; --给用户赋登陆连接权限
GRANT CONNECT TO jim; --给用户赋资源权限
GRANT RESOURCE TO jim; --回收登陆权限
REVOKE CONNECT FROM jim; --回收资源操作权限
REVOKE RESOURCE FROM jim; --锁定用户
ALTER USER jim ACCOUNT LOCK; --给用户解锁
ALTER USER jim ACCOUNT UNLOCK; --给用户修改密码
ALTER USER jim IDENTIFIED BY changeit; --创建时间维度表
CREATE TABLE DIM_DATE(
Date_ID char(8) primary key , --
Date_Name date, --2016/7/4
Year number, --
Year_Half char(6), --2016H2
Year_Month char(6), --
Year_Quarter char(6),-- 2016Q3
Half_Number number,--
Half_Name char(2), --H2
Quarter_Number number,--
Quarter_Name char(2),--Q3
Month_Number number,--
Month_Name nvarchar2(20),--JUNL
Week_Number number, --
Week_Name nvarchar2(20),--Monday
Creat_Date date, --创建时间
Update_Date date) --更新时间
; --测试选出一段时间
select to_date('2014-01-01','YYYY-MM-DD')+(rownum-1) from dual
connect by rownum<=(to_date('2015-01-01','YYYY-MM-DD')-to_date('2014-01-01','YYYY-MM-DD')); with
temp_date as (
select to_date('2014-01-01','YYYY-MM-DD')+(rownum-1) from dual
connect by rownum<=(to_date('2015-01-01','YYYY-MM-DD')-to_date('2014-01-01','YYYY-MM-DD'))
)
select * from temp_date;
--创建存储过程,导入时间
CREATE OR REPLACE PROCEDURE SP_ADD_DATE
AS
v_Half number;
v_Quarter number;
v_Month DIM_Date.Month_Name%type;
v_Month_Number number;
CURSOR c_date IS
SELECT Date_ID,DIM_Date.Date_Name FROM DIM_DATE;
c_row c_date%rowtype;
BEGIN
MERGE INTO DIM_DATE T1
USING(
select to_date('2014-01-01','YYYY-MM-DD')+(rownum-1) date_name from dual
connect by rownum<=(to_date('2018-01-01','YYYY-MM-DD')-to_date('2014-01-01','YYYY-MM-DD'))
) temp_Date
on (t1.date_name=temp_Date.date_name)
when matched then
update set t1.date_id=to_char(temp_Date.date_name,'YYYYMMDD')
when not matched then
insert (Date_ID) values(to_char(temp_Date.date_name,'YYYYMMDD'));
--循环游标
FOR c_row in c_date loop
v_Month_Number:=to_number(to_char(c_row.Date_Name,'MM'));
if v_Month_Number>6 then
v_Half:=2;
else
v_Half:=1;
end if;
update DIM_DATE set
DIM_DATE.DATE_NAME=to_date(c_row.Date_ID,'YYYY-MM-DD'),
DIM_DATE.HALF_NAME='H'||v_Half --后面在这里补充
where DIM_DATE.DATE_ID=c_row.Date_ID;
end loop;
END;
 /*******************华丽的分割线********************/
--创建地域维度表
CREATE TABLE DIM_Geo(
M_CNTY_ID number primary key,
M_CNTY nvarchar2(20), --县
M_CITY nvarchar2(20), --市
M_PRVNC nvarchar2(20)--省
); --创建销售事实表
CREATE TABLE SALES_FACT(
EMPNO NUMBER(4),
DATE_ID char(8),
CITY_ID NUMBER,
SALES NUMBER); --基于多列的联合主键
--此处为empno,date_ID, city_ID共同为一个主键
alter table SALES_FACT add constraint PK_SALES_FACT
PRIMARY KEY (EMPNO,DATE_ID,CITY_ID); --查询出事实表
WITH
v1 as (select * from SALES_FACT),
v2 as (select * from EMP),
v3 as (select * from DIM_DATE),
v9 as (select * from DIM_Geo),
v6 as (select distinct sales_fact.city_id from sales_fact),
v4 as(SELECT v2.ename,v1.date_id,v1.city_id,v1.sales FROM v1 right join v2
on v2.empno=v1.empno),
v5 as (select v4.ename,v3.date_id,v4.city_id,v4.sales from v4 partition by (v4.ename)
right join v3 on v3.date_id=v4.date_id),
v7 as (select v5.ename,v5.date_id,v6.city_id,v5.sales from v5 partition by (ename,date_id)
right join v6 on v6.city_id=v5.city_id),
v8 as (select v7.ename,v3.Date_ID,v3.Date_Name,v3.Quarter_Name,v3.Quarter_Number,v3.Month_Number,v3.MONTH_NAME,v3.Week_Name,v7.city_id,v7.sales from v7 left join v3
on v7.date_id=v3.date_id group by v7.ename,v3.Date_ID,v3.Date_Name,v3.Quarter_Name,v3.Quarter_Number,v3.MONTH_NAME,v3.Month_Number,v3.Week_Name,v7.city_id,v7.sales
order by v7.ename,v3.Quarter_Name,v3.Week_Name)
select ename,month_name,v9.M_CNTY,v9.M_CITY,v9.M_PRVNC,sum(sales) from v8
left join v9 on v8.city_id=v9.M_CNTY_ID WHERE ENAME='ADAMS' GROUP BY ename,month_name,v9.M_CNTY,
v9.M_CITY,v9.M_PRVNC ORDER BY MONTH_NAME,M_CNTY ;

Oracle中几个类似集合的用法

union all:将多个选择结果取并集,并且包含重复部分

unional:将

intersect:

minus:

Oracle拆分字段

如有下数据:我们需要将表格1中的数据形式转换成表格2的形式(也就是将老师这个字段拆成单行)

表1                                                                                                                                                                      表2

姓名 学科 老师
Jim 语文 张三 李四 王五
Jim 数学 牛儿 
Jim 英语 迈克尔 梁山伯
Lucy 语文 老五 李四
姓名 学科 老师
Jim 语文 张三
Jim 语文 李四
Jim 语文 王五
Jim 数学 牛儿
Jim 英语 麦克尔
Jim 英语 梁山伯
Lucy 语文 老五
Lucy 语文 李四

此处的核心问题就是:需要将一条数据拆成多条数据

在解决这个问题之前,我们先来看看一个例子

regexp_substr函数的使用方法:

function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)

String :需要进行正则处理的字符串

__pattern    :进行匹配的正则表达式
__position   :起始位置,从第几个字符开始正则表达式匹配(默认为1)
__occurrence :标识第几个匹配组,默认为1
__modifier   :模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)
connect by 函数
 
 
select regexp_substr('ABCD EF G','[^ ]+',1,level,'c') from dual
connect by regexp_substr('ABCD EF G','[^ ]+',1,level,'c') is not null ;

这时候,我们得到的结果是:

同样的道理,我们来实现一开始的问题,先创建这么一张关系表:

CREATE TABLE t (
student nvarchar2(20),
subject nvarchar2(10),
teacher nvarchar2(100)
); INSERT INTO t VALUES('Jim','语文','张三 李四 王五');
INSERT INTO t VALUES('Jim','数学','牛儿');
INSERT INTO t VALUES('Jim','英语','迈克尔 梁山伯');
INSERT INTO t VALUES('Lucy','语文','老五 李四');

接下来,我们实现对teacher这个字段进行拆分,teacher中的每个值是按照空格分开的。

我们实现的代码是这样的:

select student,subject,regexp_substr(teacher,'[^ ]+',1,level) from t
group by student,subject , teacher,level
connect by regexp_substr(teacher,'[^ ]+',1,level) is not null order by 1;

最终结果:

此外,我们还有另外一种方法可以来解决这个问题,前提是我们需要把所有的teacher找出来做一个临时表,

利用like方法以及左连接来拆分

select
t.student
,t.subject
,teacherRecord.teacher
from t left outer join teacherRecord
on t.teacher like '%' || teacherRecord.teacher || '%'

最终结果:

orcle数据库表导出csv文件

废话少说,直接来代码:

set colsep ,
set feedback off
set heading off
set trimout on
spool D:\DBoracle\lfc.csv
select '"' || yyyymm || '","' || yyyymmdd || '","' || bu_cd || '"from jim_CALL;
spool off
exit

  

Oracle基本函数即字段拆分的更多相关文章

  1. Oracle 字段拆分替换在合并成一条

    看了网上很多Oracle字段拆分的实例,但是都未能完全满足要求,或许是我水平不够未能很好的理解,如果有大神懂得并且愿意告知我的,可以私信我,在这里真诚的感谢! 1. 首先建立表并插入测试数据 drop ...

  2. Oracle数据库BLOB字段的存取

    述]     Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cur ...

  3. java 存储oracle的clob字段

    项目中有很长的字符创需要存储,用到了oracle的clob字段,直接很长的字符串插入到clob字段中会报字符过长的异常,于是便寻求解决方案.看到这个博客写的还不错 首先,创建一个含CLOB字段的表: ...

  4. 解决比较Oracle中CLOB字段问题

    解决比较Oracle中CLOB字段问题   Oracle中CLOB和BLOB字段虽说在开发中满足了存放超大内容的要求,但是在一些简单使用中确频频带来麻烦.CLOB中存放的是指针,并不能直接取到实际值. ...

  5. sybase数据库和oracle数据库中字段中含有换行符的解决办法

    最近在做数据库从sybase到oracle的迁移工作,sybase数据库表bcp导出后,通过sqlldr导入到oracle数据库,然后oracle数据库通过spool按照sybase数据库bcp的格式 ...

  6. Oracle 批量修改字段长度

    Oracle 批量修改字段长度 SELECT  'alter table '||a.table_name||' MODIFY  '||A.COLUMN_NAME||' VARCHAR2(100);' ...

  7. oracle数据库调整字段顺序

    oracle数据库调整字段顺序 https://blog.csdn.net/xiaobaixie/article/details/77892034

  8. sqlserver 将 “用 特定字符 分隔的一个字段” 拆分成多个字段,然后两个表之间数据更新

    将源TXT文件sourceFile_table.txt导入数据库,生成新表dbo.sourceFile_table.新增字段lon.lat.shi.xian 源表dbo.sourceFile_tabl ...

  9. oracle删除表字段和oracle表增加字段

    这篇文章主要介绍了oracle表增加字段.删除表字段修改表字段的使用方法,大家参考使用吧   添加字段的语法:alter table tablename add (column datatype [d ...

随机推荐

  1. c++ 插入排序算法

    第一.算法描述       直插排序很容易理解,在我们打扑克牌的时候,每一次摸完牌,都会按数字大小或者花色,插入到合适的位置,直到摸完最后一张牌,我们手中的牌已经按大小顺序排列好了.这整个过程就是一个 ...

  2. json 工具处理类

    package com.js.ai.modules.pointwall.util; import java.lang.reflect.Type; import java.net.URLDecoder; ...

  3. 2007.1.1 string.Format

    String.Format举例(C#) stringstr1 =string.Format("{0:N1}",56789); //result: 56,789.0 stringst ...

  4. UML 学习[一]

    上了好久软件工程,才开始这门课程中重要部分的学习----uml图. 统一建模语言(UML,英语:Unified Modeling Language)是非专利的第三代建模和规约语言.UML是一种开放的方 ...

  5. Python 标准库 -> Pprint 模块 -> 用于打印 Python 数据结构

    使用 pprint 模块 pprint 模块( pretty printer ) 用于打印 Python 数据结构. 当你在命令行下打印特定数据结构时你会发现它很有用(输出格式比较整齐, 便于阅读). ...

  6. GET与POST方法

    HTTP中的GET,POST,PUT,DELETE对应着对这个资源的查,改,增,删4个操作.GET一般用于获取/查询资源信息,而POST一般用于更新资源信息. 1.根据HTTP规范,GET用于信息获取 ...

  7. JAVA基础知识总结10(包类)

    包:定义包用package关键字. 1:对类文件进行分类管理. 2:给类文件提供多层名称空间. 如果生成的包不在当前目录下,需要最好执行classpath,将包所在父目录定义到classpath变量中 ...

  8. 为Docker镜像添加SSH服务

    一.基于commit命令创建 1. 首先下载镜像 $ docker run -it ubuntu:16.04 /bin/bash 2. 安装SSH服务 #更新apt缓存 root@5ef1d31632 ...

  9. 利用rowid删除数据库中无主键的相同记录

    数据库中表没有添加主键,误插入了两条数据,现在需要删除其中一条记录. 利用rowid号,因为表中的每一行数据都有一个rowid,这个rowid 号是不同的,用select可以查询出来. select ...

  10. FOUC

    如果使用import方法对CSS进行导入,会导致某些页面在Windows 下的Internet Explorer出现一些奇怪的现象:以无样式显示页面内容的瞬间闪烁,这种现象称之为文档样式短暂失效(Fl ...