您的位置:首页 > 数据库 > Oracle

Oracle SQL常用内置函数

2017-12-23 22:14 471 查看
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/
4000
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('我的郵箱yihuiworld@126.com','[[: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(‘我的郵箱yihuiworld@126.com’,’[[:lower:]]{1,}+@{1}+[[:alnum:]]{1,}+.{1}+[[:alpha:]]{1,}’)

–结果: yihuiworld@126.com

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<d2則返回負數,如果d1和d2的天數相同或都是月底則返回整數,否則oracle以每月31天為準來計算結果的小數部份


[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]):返回匹
c681
配于特定運算式的結果

如果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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: