Oracle SQL常用内置函数

Oracle SQL内置函数
Oracle内置SQL函数主要分为一下类别:数字函数、字符函数、日期函数、转换函数、集合函数、分析/聚合函数
本手册所有示例均以TIPTOP GP 5.10 ERP数据库表为基础演示。数据字典下载地址:http://pan.baidu.com/s/1jG1PGF0

1、数字函数
abs(n):返回数字n的绝对值
ceil(n):返回>=数字n的最小整数
floor(n):返回<=数字n的最大整数
round(n,[m]):四舍五入运算,如果m缺省则四舍五入到整数位
m<0,四舍五入到小数点的前m位,m>0四舍五入到小数点的后m位
trunc(n,[m]):截取数字,如果m缺省则将小数位截去
m<0,截取到小数点的前m位,m>0截取到小数点的后m位
[sql] view plain copy

1. --demo:abs()、ceil()、floor()、trunc()  
2. SELECT abs(-2.3),  
3.        ceil(-2.6),ceil(2.6),  
4.        floor(-2.6),floor(2.6),  
5.        round(-666.588),round(-666.588,2),round(-666.588,-2),  
6.        trunc(-666.588),trunc(-666.588,2),trunc(-666.588,-2)  
7.    FROM dual  

–结果:

ABS(-2.3) 2.3
CEIL(-2.6) -2
CEIL(2.6) 3
FLOOR(-2.6) -3
FLOOR(2.6) 2
ROUND(-666.588) -667
ROUND(-666.588,2) -666.59
ROUND(-666.588,-2) -700
TRUNC(-666.588) -666
TRUNC(-666.588,2) -666.58
TRUNC(-666.588,-2) -600

   sqrt(n):返回数字n(n必须大于0)的平方根
   power(n,m):返回数字n的m次幂,底数n和指数m都可以是任意数字,但是如果底数n为负数则指数m必须为正数
   exp(n):返回e(2.71828183....)的n次幂
   ln(n):返回数字n(n必须大于0)的自然对数
   log(n,m):返回底数为n(除0及1的正整数)的m(任何正整数)对数
   mod(n,m):返回数字n/m的余数,如果数字m=0则返回n

[sql] view plain copy

1. --demo:sqrt(),power(),exp(),ln(),log(),mod()  
2. SELECT sqrt(4),power(2,3),exp(1),ln(10),log(2,8),mod(5,2)  
3.   FROM dual  

–结果:

SQRT(4) 2
POWER(2,3) 8
EXP(1) 2.71828182845905
LN(10) 2.30258509299405
LOG(2,8) 3
MOD(5,2) 1

   cos(n):返回数字n(弧度单位表示的角度值)的余弦值
   cosh(n):返回数字n的双曲余弦值
   acos(n):返回数字n的反余弦值,求的结果单位为弧度,n的范围为 -1 < n < 1
   sin(n):返回数字n(弧度单位表示的角度值)的正弦值
   sinh(n,m):返回数字n的双曲正弦值
   asin(n,m):返回数字n的反正弦值,求的结果单位为弧度,n的范围为 -1 < n < 1
   tan(n):返回数字n(弧度表示的角度值)的正切值
   tanh(n):返回数字n的双曲正切值
   atan(n):返回数字n的反正切值,求的结果单位为弧度,n的范围任意数值
   atan(n,m):返回数字n/m的反正切值,求的结果单位为弧度,你可以为任意数值,m不可为0

[sql] view plain copy

1. --三角函数应用demo:  
2. SELECT cos(0.5),cosh(2),acos(1),  
3.        sin(0.5),sinh(2),asin(0),  
4.        tan(0.5),tanh(2),atan(8),atan(16/2)  
5.  FROM dual  

2、字符函数
ascii(n):返回字符c的ascii值
chr(n):将ascii值转换为对应的字符
initcap(s):将字符串s所有的单词(依空格或非字母字符划分单词区间)的首字母大写,其余小写
lower(s):将字符串s中所有的字符转换为小写
upper(s):将字符串s中所有的字符转换为大写
concat(s1,s2):将字符串s2连接在s1后面,等同于操作符||
length(s):将返回字串s的长度,返回的长度包括其中的所有空格(尾部空格也算);如果s为null,则返回null
[sql] view plain copy

1. --字符函数demo:  
2. SELECT ascii('A'),chr(65),concat('Hello','World'),  
3.        initcap('hello woRld'),  
4.        lower('HeLLo woRld'),upper('HeLLo woRld'),  
5.        length('HeLLo woRld'),length('李艺辉')  
6.   FROM dual  

–结果:
ASCII(‘A’) 65
CHR(65) A
CONCAT(‘HELLO’,’WORLD’) HelloWorld
INITCAP(‘HELLOWORLD’) Hello World
LOWER(‘HELLOWORLD’) hello world
UPPER(‘HELLOWORLD’) HELLO WORLD
LENGTH(‘HELLOWORLD’) 11
LENGTH(‘李YI辉’) 4

   lpad(s1,n,s2):在字串s1的左端填充字串s2,直至填充后的s1的总长度为n
                            如果不指定s2则默认为空格
                            如果s1的长度>n,则直接返回s1左端的n个字符
   rpad(s1,n,s2):在字串s1的右端填充字串s2,直至填充后的s1的总长度为n
                            如果不指定s2则默认为空格
                            如果s1的长度>n,则直接返回s1左端的n个字符

[sql] view plain copy

1. --lpad、rpad  
2. SELECT lpad('a',10,'8'),lpad('LaaaaaaR',6,'8'),  
3.        rpad('a',10,'8'),rpad('LaaaaaaR',6,'8')  
4.   FROM dual  

–结果:
lpad(‘a’,10,’8’) 888888888a
lpad(‘laaaaaar’,6,’8’) laaaaa
rpad(‘a’,10,’8’) a888888888
rpad(‘laaaaaar’,6,’8’) laaaaa

   instr(s1,s2,n,m):取得子串s2在字串s1中的位置
                                n表示在s1中开始搜索的位置,m表示字串s2出现的次数
                                如果n为负数,则表示从尾部开始搜索,n与m默认为1

[sql] view plain copy

1. SELECT instr('888terryterry','terry',1,1) ,instr('888terryterry','terry',1,2),  
2.        instr('888terryterry','terry',-1,1),instr('888terryterry','terry',-1,2)  
3.   FROM dual  

–结果:
instr(‘888terryterry’,’terry’,1,1) 4
instr(‘888terryterry’,’terry’,-1,1) 9
instr(‘888terryterry’,’terry’,1,2) 9
instr(‘888terryterry’,’terry’,-1,2) 4

     substr(s1,m,n):取得字串s1从m开始,长度为n的子串,m>0表示从头开始搜索,m<0表示从尾开始

[sql] view plain copy

1. SELECT substr('李藝輝',1,2),substr('terry',-4,3)  
2.   FROM dual  

–结果:
substr(‘李藝輝’,1,2) 李藝
substr(‘terry’,-4,3) err

     ltrim(s1,set):从左端开始逐一取得字串s1左端包含的set中的任何字符
                            当遇到不是set中的字符是,则结束并返回剩余结果
     rtrim(s1,set):从右端开始逐一取得字串s1右端包含的set中的任何字符
                            当遇到不是set中的字符是,则结束并返回剩余结果
     trim(c FROM s2):从字串s2的头部、尾部、或两端截去字符c(c只能够是一个字符)
                                  当遇到不是set中的字符是,则结束并返回剩余结果

[sql] view plain copy

1. SELECT ltrim('terry','t'),ltrim('terry','ter'),ltrim('terry','e'),  
2.        rtrim('terry','y'),rtrim('terry','ry'),rtrim('terry','yre'),  
3.        trim('e' from 'terry'),trim('t' from 'terry'),trim('y' from 'terryy')  
4.   FROM dual  

–结果:
ltrim(‘terry’,’t’) erry
ltrim(‘terry’,’ter’) y
ltrim(‘terry’,’e’) terry
rtrim(‘terry’,’y’) terr
rtrim(‘terry’,’ry’) te
rtrim(‘terry’,’yre’) t
trim(‘e’from’terry’) terry
trim(‘t’from’terry’) erry
trim(‘y’from’terryy’) terr

     replace(s1,s2,s3):将s1字串中的子串s2用s3替代,如果s2为null则返回原来的字串s1
                                    注意:如果s3为null,则会去掉子串s2

[sql] view plain copy

1. SELECT replace('李藝輝-TERRY','李藝輝','諸葛錢好'),  
2.        replace('李藝輝-TERRY','李藝輝')  
3.   FROM dual  

–结果:
replace(‘李藝輝-TERRY’,’李藝輝’,’諸葛錢好’) 諸葛錢好-TERRY
replace(‘李藝輝-TERRY’,’李藝輝’) -TERRY

      translate(s1,froms,tos):将字符串s1按照froms和tos的对应关系进行转换

[sql] view plain copy

1. SELECT translate('terry','abcdefgxyz','8888888666')  
2.   FROM dual  

–结果:
translate(‘terry’,’abcdefgxyz’,’8888888666’) t8rr6

        regexp_substr(s1,pattern,position,occurrence,match_parameter):
                  按照正则表达式pattern从s1字串中的position位置开始
                  截取第occurrence次出现的匹配pattern的字串,matche_parameter为默认匹配的文本
                  position,occurrence,matche_parameter 默认为1,1," "
        regexp_replace(s1,pattern,position,occurrence,match_parameter):
                  正则表达式扩展replace的功能,用于按照特定的表达式pattern的规则替换字串串s1
                  s1指定替换字符串,position指定起始搜索位置
                  occurrence指定替换出现的第n个字符串
                  matche_parameter指定默认匹配操作的文本串
        regexp_like():用正则表达式扩展后的like
        regexp_instr():用正则表达式扩展后的instr

[sql] view plain copy

1. SELECT regexp_substr('我的郵箱[email protected]','[[:lower:]]{1,}+@{1}+[[:alnum:]]{1,}+\.{1}+[[:alpha:]]{1,}'),  
2.        regexp_replace('這個屌http://www.space.com.tw/product','http://([[:alnum:]]+\.?){3,4}+[[:print:]]{1,}','www.terry.com')  
3.   FROM dual  

regexp_substr(‘我的郵箱[email protected]’,’[[:lower:]]{1,}+@{1}+[[:alnum:]]{1,}+.{1}+[[:alpha:]]{1,}’)
–结果: [email protected]
regexp_replace(‘這個屌http://www.space.com.tw/product‘,’http://([[:alnum:]]+.?){3,4}+[[:print:]]{1,}’,’www.terry.com’)
–结果:這個屌www.terry.com


3、日期函数
sysdate:返回系统当前日期时间
systimestamp:返回系统当前日期时间和时区
current_date:返回当前回话时区所对应的日期和时间
current_timestamp:返回当前回话时区所对应的日期时间
localtimestamp:返回当前回话时区所对应的日期时间
systimestamp:返回系统当前日期时间和时区
sessiontimezone:返回当前回话所在的时区
dbtimezone:返回资料库所在的时区
[sql] view plain copy

1. SELECT sysdate,systimestamp,current_date,current_timestamp,  
2.        localtimestamp,sessiontimezone,dbtimezone  
3.   FROM dual  

–结果:
SYSDATE 2015/3/25 13:29:38
SYSTIMESTAMP 25-3月 -15 01.29.38.867634 下午 +08:00
CURRENT_DATE 2015/3/25 13:29:38
CURRENT_TIMESTAMP 25-3月 -15 01.29.38.867641 下午 +08:00
LOCALTIMESTAMP 25-3月 -15 01.29.38.867641 下午
SESSIONTIMEZONE +08:00
DBTIMEZONE +08:00

  add_months(d,n):返回指定日期d之后(或前)的n個月所對應的日期時間;n>0:之后,n<0:之前
  extract():用於從特定的日期時間值里取出所需要的特定數據(如日期、月份、日、時間等)
  last_day(d):用於返回指定日期所在月份的最後一天
  next_day(d,char):返回指定日期后的一個工作日(由char指定)所對應的日前
  round(d[,fmt]):返回日期時間的四舍五如結果,如果fmt指定年度則7月1日為分界線
                          如果fmt指定月則16日為分界線,如果fmt指定天則中午12:00為分界線
  trunc(d[,fmt]):用於截斷日期時間數據,如果fmt指定年度則結果為本年的1月1日
                         如果fmt指定月則結果為本月1日,如果fmt空則結果為截取日期時間數據中的日期

[sql] view plain copy

1. SELECT sysdate,add_months(sysdate,4),add_months(sysdate,-4),  
2.        extract(MONTH from sysdate),last_day(sysdate),next_day(sysdate,'星期一'),  
3.        round(sysdate,'YEAR'),round(sysdate,'MONTH'),round(sysdate,'DAY'),round(sysdate),  
4.        trunc(sysdate,'YEAR'),trunc(sysdate,'MONTH'),trunc(sysdate,'DAY'),trunc(sysdate)  
5.   FROM dual  

–结果:
SYSDATE 2015/3/25 13:40:14
ADD_MONTHS(SYSDATE,4) 2015/7/25 13:40:14
ADD_MONTHS(SYSDATE,-4) 2014/11/25 13:40:14
EXTRACT(MONTHFROMSYSDATE) 3
LAST_DAY(SYSDATE) 2015/3/31 13:40:14
NEXT_DAY(SYSDATE,’星期一’) 2015/3/30 13:40:14
ROUND(SYSDATE,’YEAR’) 2015/1/1
ROUND(SYSDATE,’MONTH’) 2015/4/1
ROUND(SYSDATE,’DAY’) 2015/3/29
ROUND(SYSDATE) 2015/3/26
TRUNC(SYSDATE,’YEAR’) 2015/1/1
TRUNC(SYSDATE,’MONTH’) 2015/3/1
TRUNC(SYSDATE,’DAY’) 2015/3/22
TRUNC(SYSDATE) 2015/3/25

   to_timestamp(chr[fmt[,nls_param]]):將符合特定日期和時間按格式的字符串轉變為TIMESTAMP類型 

[sql] view plain copy

1. --查詢 2015-03-25 11:30:00 時間點時 oay_file 記錄 [时间搓不能>当前时间点 且 不能太早]  
2. select * from oay_file as of timestamp to_timestamp('2015-03-25 11:30:00','YYYY-MM-DD HH24:MI:SS')  


   month_between(d1,d2):返回日期d1與d2之間相差的月份數
                                            如果d1

[sql] view plain copy

1. select sysdate,months_between(sysdate,to_date('2012/06/30','YYYY/MM/DD'))  
2.   from dual  

–结果:
SYSDATE 2015/3/25 13:49:40
MONTHS_BETWEEN(SYSDATE,TO_DATE 32.8572954002389


4、数据库系统相关配置
sys_context(context,attribute):返回應用上下文特定屬性,其中context指定應用上下文名,attribute指定對應的屬性
[sql] view plain copy

1. select SYS_CONTEXT('USERENV','TERMINAL') terminal,  
2.    SYS_CONTEXT('USERENV','LANGUAGE') language,  
3.    SYS_CONTEXT('USERENV','SESSIONID') sessionid,  
4.    SYS_CONTEXT('USERENV','INSTANCE') instance,  
5.    SYS_CONTEXT('USERENV','ENTRYID') entryid,  
6.    SYS_CONTEXT('USERENV','ISDBA') isdba,  
7.    SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory,  
8.    SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency,  
9.    SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar,  
10.    SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format,  
11.    SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,  
12.    SYS_CONTEXT('USERENV','NLS_SORT') nls_sort,  
13.    SYS_CONTEXT('USERENV','CURRENT_USER') current_user,  
14.    SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,  
15.    SYS_CONTEXT('USERENV','SESSION_USER') session_user,  
16.    SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,  
17.    SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,  
18.    SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,  
19.    SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,  
20.    SYS_CONTEXT('USERENV','DB_NAME') db_name,  
21.    SYS_CONTEXT('USERENV','HOST') host,  
22.    SYS_CONTEXT('USERENV','OS_USER') os_user,  
23.    SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,  
24.    SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,  
25.    SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,  
26.    SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id,  
27.    SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id,  
28.    SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type,  
29.    SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data  
30.  from dual  

–结果:
TERMINAL PCS13098
LANGUAGE SIMPLIFIED CHINESE_CHINA.AL32UTF8
SESSIONID 26273213
INSTANCE 1
ENTRYID
ISDBA FALSE
NLS_TERRITORY CHINA
NLS_CURRENCY RMB
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE SIMPLIFIED CHINESE
NLS_SORT BINARY
CURRENT_USER SZPF
CURRENT_USERID 55
SESSION_USER SZPF
SESSION_USERID 55
PROXY_USER
PROXY_USERID
DB_DOMAIN
DB_NAME topprod
HOST DOMAIN\PCS13098
OS_USER terrylee
EXTERNAL_NAME
IP_ADDRESS 192.168.5.227
NETWORK_PROTOCOL tcp
BG_JOB_ID
FG_JOB_ID 0
AUTHENTICATION_TYPE DATABASE
AUTHENTICATION_DATA

   UID:返回當前會話用戶的ID號
   USER:返回當前會話所對應資料庫用戶名
   USERENV(parameter):返回當前會話上下文的屬性信息
                                         其中parameter可取值:ISDBA、LANGUAGE、TERMINAL、CLIENT_INFO

[sql] view plain copy

1. select uid,user,userenv('ISDBA') from dual  

–结果:
UID 55
USER SZPF
USERENV(‘ISDBA’) FALSE

    sys_guid():用於生成類型為RAW的16字節的唯一標識符,每次調用該函數都會生成不同的RAW數據

[sql] view plain copy

1. select sys_guid(),sys_guid() from dual  

–结果:
SYS_GUID() 1217A841ED2B6437E0530900A8C0B6F8
SYS_GUID() 1217A841ED2C6437E0530900A8C0B6F8


5、复杂单行函数
coalesce(expr1[,expr2]…):返回運算式中第一個not null運算式的結果
decode(expr,search1,result[,search2,result2,..][,default]):返回匹配于特定運算式的結果
如果search1匹配expr則返回result1,如果如果search2匹配expr則返回result2
依次類推,如果沒有任何匹配關係則返回default
[sql] view plain copy

1. select coalesce('','','terry','zhanna'),  
2.        decode('M','W','girl','M','boy','person')  
3.     
4.   from dual  

–结果:
coalesce(”,”,’terry’,’zhanna’) terry
decode(‘M’,’W’,’girl’,’M’,’boy’,’person’) boy

    greatest(expr1[,expr2]...):返回列表運算式expr1,expr2,...中值最大的一個
                                                  在比較之前,expr2等項會被隱含地轉換為expr1的時候據類型
    least(expr1[,expr2]...):返回列表運算式expr1,expr2,...中值最小的一個
                                            在比較之前,expr2等項會被隱含地轉換為expr1的時候據類型
    nullif(expr1,expr2):比較expr1和expr2,如果二者相等則返回null,否則返回expr1

[sql] view plain copy

1. select greatest('terry','888','zhanna','666'),  
2.        least('terry','888','zhanna','666'),  
3.        nullif('terry','zhanna'),nullif('1','1')  
4.   from dual  

–结果:

greatest(‘terry’,’888’,’zhanna’,’666’)zhannanullif(‘terry’,’zhanna’)terryleast(‘terry’,’888’,’zhanna’,’666’)666nullif(‘1’,’1’)

    sys_connect_by_path(column,char):用於返回從根到子節點的列值路進,值適用于層次查詢

[sql] view plain copy

1. --展成品料號TE902C BOM下階元件  
2. select lpad(' ',2*level-1)||sys_connect_by_path(bmb03,'|--') "TE902C展BOM元件"   
3.   from bmb_file  
4.   start with bmb01 = 'TE902C'  
5.   connect by prior bmb03 = bmb01  

–结果:
|–1300-00677002
|–1300-00677002|–3230-00677000
|–1300-00677002|–5410-TE902C02
|–1300-00677002|–LPLA10002
|–1300-00677002|–LPLA10002|–1800-00100117
|–1300-00677002|–LPLA10002|–1800-00100117|–2101-01002000
|–1300-00677002|–LPLA10002|–1800-00100117|–2101-02001034
|–1300-00677002|–LPLA10002|–1800-00100118
|–1300-00677002|–LPLA10002|–1800-00100118|–2102-02003001
|–1300-00677002|–LPLA10002|–1800-00100118|–2230-05005000
|–1300-00677002|–LPLA10002|–1800-00200300
|–1300-00677002|–LPLA10002|–1800-00200300|–2101-04012016
|–1300-00677002|–LPLA10002|–1800-00200300|–2102-02003001
|–1300-00677002|–LPLA10002|–1800-00200311
|–1300-00677002|–LPLA10002|–1800-00200311|–2101-04012016
|–1300-00677002|–LPLA10002|–1800-00200325
|–1300-00677002|–LPLA10002|–1800-00200325|–2101-04012016
|–1300-00677002|–LPLA10002|–1800-00200325|–2230-02002001
|–1300-00677002|–LPLA10002|–1800-00200409
|–1300-00677002|–LPLA10002|–1800-00200409|–2101-04012016
|–1300-00677002|–LPLA10002|–1800-00200409|–2230-02002001
|–1300-00677002|–LPLA10002|–2101-02001035
|–4410-TE902C00
|–6110-11001000


6、分析聚合函数
rank(expr1,expr2,…) within group(order by col1,col2,…):返回特定數值在統計數值中所佔據的等級,expr1,expr2,…必須為常數
dense_rank(expr1,expr2,…) within group(order by expr1,expr2,…):返回特定數值在一組行數據中的等級
percent_rank(expr1,expr2,…) within group(order by expr1,expr2,…):返回特定數值在統計數值在統計級別中所占的比例
[sql] view plain copy

1. select rank(1530.100000) within group(order by apa31) rank_level,  
2.        dense_rank(1530.100000) within group(order by apa31) dense_rank_level,  
3.        percent_rank(1530.100000) within group(order by apa31) percent_quto  
4.   from ds.apa_file  

–结果:
RANK_LEVEL DENSE_RANK_LEVEL PERCENT_QUTO
2254 1159 0.312136326

    percentile_cont(percent_expr)within group(order by expr):返回在計級別中處於某個百分點的特定數值(按照連續分佈模型確定)
    percentile_disc(percent_expr)within group(order by expr):返回在計級別中處於某個百分點的特定數值(按照離散分佈模型確定)
    first:取得排序等級的第一級,然後使用分組函數匯總該等級的數據,該函數不能夠單獨使用,必須與其它分組函數結合使用
    last:取得排序等級的最後一級,然後使用分組函數匯總該等級的數據,該函數不能夠單獨使用,必須與其它分組函數結合使用

[sql] view plain copy

1. select min(apa35) keep (dense_rank first order by apa31 desc) "AP金額最多等級中的最小已付",  
2.         
3.        max(apa35) keep (dense_rank first order by apa31 desc) "AP金額最多等級中的最大已付"  
4.     
5.   from ds.apa_file  

–结果:
AP金額最多等級中的最小已付 AP金額最多等級中的最大已付
3500000 3500000

    over()視窗函數
       over ([partition by col1] order by col2) ) 表示依col1分組,依col2在分組類排序
       over函數不能夠單獨使用,必須和其它的分組/分析函數配合使用
       over函數不可用在where子句中

[sql] view plain copy

1. --統計2G88與2G60部門2012-04月薪資分配    
2. select cqk09 姓名,cqk05 部門,cqk30 薪水,    
3.        sum(cqk30) over(partition by cqk05 order by cqk09) 部門薪水連續加總,    
4.        sum(cqk30) over(partition by cqk05) 部門薪水總計,    
5.        100*(round(cqk30/sum(cqk30) over(partition by cqk05),5)) "個人薪水占部門份額%",    
6.        sum(cqk30) over(order by cqk05,cqk09) 所有薪水連續加總,    
7.        sum(cqk30) over() 所有薪水總計,    
8.        100*(round(cqk30/sum(cqk30) over(),5)) "個人薪水占總和份額%"    
9.   from cqk_file    
10.   where cqk03=2012 and cqk031 = 4 and cqk05 in ('2G88','2G60')   

–结果:

姓名部門薪水部門薪水連續加總部門薪水總計個人薪水占部門份額%所有薪水連續加總所有薪水總計個人薪水占總和份額%AX2G60330863308613838223.909330863356669.857BX2G607788411097013838256.28211097033566623.203CX2G602741213838213838219.8091383823356668.166DX2G88562735627319728428.52419465533566616.765SS2G887099412726719728435.98626564933566621.15IP2G883918716645419728419.86330483633566611.674DS2G883083019728419728415.6273356663356669.185

[sql] view plain copy

1. --row_number()結合over排序統計2012-04薪資水平中各部門最高的2位    
2.   -- select cqk09 姓名,cqk05 部門,cqk30 薪水,    
3.   --  row_number() over(partition by cqk05 order by cqk30 desc) as salary_order      
4.   --  from cqk_file    
5.   --  where cqk03=2012 and cqk031 = 4 and salary_order<=2 --此處無法引用salary_order,直接用over運算式也是錯誤的    
6.   -- 上述SQL段是錯誤的over查詢出來依別名做列也不可以于where子句中使用    
7.   select cqk09 姓名,cqk05 部門,cqk30 薪水,salary_order 排序     
8.     from (    
9.            select cqk09,cqk05,cqk30,    
10.                   row_number() over(partition by cqk05 order by cqk30 desc) salary_order      
11.            from cqk_file    
12.            where cqk03=2012 and cqk031 = 4 and cqk05 in('2G60','2G88')    
13.          )cqk_temp_file    
14.     where salary_order <= 2    

–结果:

姓名部門薪水排序BX2G60778841AX2G60330862SS2G88709941DX2G88562732

row_number() 、rownum、rank()、dense_rank()區別說明
row_number() over(partition by col1 order by col2):此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序)
rank():是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)
dense_rank():是连续排序,有两个第二名时仍然跟着第三名.相比之下row_number是没有重复值的.
rank()與dense_rank()及row_number()不同點說明
rank()依薪水排序 dense_rank()依薪水排序 row_number()依薪水排序

姓名部門薪水排序 姓名部門薪水排序 姓名部門薪水排序SI2BSB88881 SI2BSB88881 SI2BSB88881DI2BSB66662 DI2BSB66662 DI2BSB66662BP2BSB66662 BP2BSB66662 BP2BSB66663SP2BSB32324 SP2BSB32323 SP2BSB32324

  group_id():區分分組結果中的重複行
  grouping(expr):用於確定分組結果是否用到了特定的運算式
                              返回值0表示用到了該運算式,返回值1表死未用到該運算式
  grouping_id(expr1[,expr2],,,):用於返回對應于特定行的grouping位向量的值

[sql] view plain copy

1. select apa00,apa13,sum(apa31f),grouping(apa13)     
2.   from apa_file     
3.   group by rollup(apa00,apa13)    
4.   order by apa00,apa13     

–结果:
APA00APA13 SUM(APA31F) GROUPING(APA13)11HKD23731714.84 011NTD942131 011RMB22999119.68 011USD2180 011 47675145.52 112HKD107141459.6 012NTD119680 012RMB69738785.2 012USD92773.7 012 177092698.5 1…… … …


[sql] view plain copy

1. --一條SQL查詢出所有程式action中英文說明:  
2. select program as "程式代碼", gaz03 as "程式名稱" ,actionResultList as "程式功能清單"     
3.  from (select program,substr(max(sys_connect_by_path(action,';')),2) as actionResultList        
4.         from (select program,action,rank() over (partition by actionList.program order by actionList.action desc)actionOrder    
5.               from (select gap01 as program,gap02||':'||gbd04 as action from gap_file    
6.                      left join gbd_file on gap02 = gbd01    
7.                      where gbd03 = '0'    
8.                    )actionList    
9.              )actionOrderList    
10.        connect by actionOrder-1 = prior actionOrder and program = prior program    
11.        start with actionOrder = 1    
12.        group by program    
13.        order by program    
14.       )actionReusltTable    
15.    left join gaz_file on program = gaz01    
16.    where gaz02 = '0'    
17.    order by program      

–结果:
程式代碼程式名稱程式功能清單1aapi001集團代收付基本資料維護作業query:查詢;output:列印;locale:語言;help:幫助….2aapi010零用金應付帳款系統單據性質維護作業invalid:無效;insert:新增;authorization:使用者設限…3aapi101應付帳款各期統計開帳作業previous:上筆;next:下筆;modify:更改…4aapi102應付帳款(依單號)各期統計開帳作業related_document:相關文件;query:查詢…5aapi103應付帳款系統單據性質維護作業dept_authorization:部門設限;delete:刪除…6aapi104帳款類別維護作業query:查詢;qbe_select:條件查詢;qbe_save:條件儲存…7aapi105留置原因維護作業query:查詢…8aapi108統一編號資料維護作業exit:結束;delete:刪除;controlz:必要欄位;controlg:開窗查詢…9aapi111零用金應付帳款各期統計開帳作業previous:上筆;next:下筆;modify:更改insert:新增;delete:刪除…

統計’Tri-Net’,’AMBER -W’,’Belkin-C’,’GTC’,’SAN SHIN’客戶各月份接單金額
要求輸出格式為
接單月份
Tri-Net
AMBER -W
Belkin-C
GTC
SAN SHIN
2011/08
接單金額
接單金額
接單金額
接單金額
接單金額
….
….
….

[sql] view plain copy

1. with cte_oea_file as    
2. (select substr(to_char(oea02,'YYYY/MM/DD'),1,7) po_date,oea032 po_custom,sum(oeb14) po_sales    
3.    from oea_file join oeb_file on oea01 = oeb01    
4.    where oea032 in ('Tri-Net','AMBER -W','Belkin-C','GTC','SAN SHIN')    
5.    group by substr(to_char(oea02,'YYYY/MM/DD'),1,7),oea032    
6.   order by 1,2    
7. )    
8. select po_date "接單月份",    
9.    sum(decode(po_custom,'Tri-Net',po_sales,0))  "Tri-Net",    
10.    sum(decode(po_custom,'AMBER -W',po_sales,0)) "AMBER -W",    
11.    sum(decode(po_custom,'Belkin-C',po_sales,0)) "Belkin-C",    
12.    sum(decode(po_custom,'GTC',po_sales,0)) "GTC",    
13.    sum(decode(po_custom,'SAN SHIN',po_sales,0)) "SAN SHIN"    
14.  from cte_oea_file    
15.  group by po_date    
16.  order by po_date    

接單月份 Tri-Net AMBER -W Belkin-C GTC SAN SHIN2011/08768796.48161573.6814162.531945010250.962011/09566008.26221550.9258366.526807089202011/10270341.6876241.951474028585090202011/11464575.390284704469675150402011/12295007.550140446.2918000212502012/0170835.50027485051002012/02148424.5301425235255406902012/03179333.310063855055596.42012/04158162.5100212000101102012/0500022060030160

你可能感兴趣的:(oracle,SQL)