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位

--demo:abs()、ceil()、floor()、trunc()
SELECT abs(-2.3),
       ceil(-2.6),ceil(2.6),
       floor(-2.6),floor(2.6),
       round(-666.588),round(-666.588,2),round(-666.588,-2),
       trunc(-666.588),trunc(-666.588,2),trunc(-666.588,-2)
   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

--demo:sqrt(),power(),exp(),ln(),log(),mod()
SELECT sqrt(4),power(2,3),exp(1),ln(10),log(2,8),mod(5,2)
  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

--三角函数应用demo:
SELECT cos(0.5),cosh(2),acos(1),
       sin(0.5),sinh(2),asin(0),
       tan(0.5),tanh(2),atan(8),atan(16/2)
 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

--字符函数demo:
SELECT ascii('A'),chr(65),concat('Hello','World'),
       initcap('hello woRld'),
       lower('HeLLo woRld'),upper('HeLLo woRld'),
       length('HeLLo woRld'),length('李艺辉')
  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个字符

--lpad、rpad
SELECT lpad('a',10,'8'),lpad('LaaaaaaR',6,'8'),
       rpad('a',10,'8'),rpad('LaaaaaaR',6,'8')
  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

SELECT instr('888terryterry','terry',1,1) ,instr('888terryterry','terry',1,2),
       instr('888terryterry','terry',-1,1),instr('888terryterry','terry',-1,2)
  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表示从尾开始

SELECT substr('李藝輝',1,2),substr('terry',-4,3)
  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中的字符是,则结束并返回剩余结果

SELECT ltrim('terry','t'),ltrim('terry','ter'),ltrim('terry','e'),
       rtrim('terry','y'),rtrim('terry','ry'),rtrim('terry','yre'),
       trim('e' from 'terry'),trim('t' from 'terry'),trim('y' from 'terryy')
  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

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

--结果:

replace('李藝輝-TERRY','李藝輝','諸葛錢好')       諸葛錢好-TERRY
replace('李藝輝-TERRY','李藝輝')                     -TERRY

 

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

SELECT translate('terry','abcdefgxyz','8888888666')
  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

SELECT regexp_substr('我的郵箱[email protected]','[[:lower:]]{1,}+@{1}+[[:alnum:]]{1,}+\.{1}+[[:alpha:]]{1,}'),
       regexp_replace('這個屌http://www.space.com.tw/product','http://([[:alnum:]]+\.?){3,4}+[[:print:]]{1,}','www.terry.com')
  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:返回资料库所在的时区

SELECT sysdate,systimestamp,current_date,current_timestamp,
       localtimestamp,sessiontimezone,dbtimezone
  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空則結果為截取日期時間數據中的日期

SELECT sysdate,add_months(sysdate,4),add_months(sysdate,-4),
       extract(MONTH from sysdate),last_day(sysdate),next_day(sysdate,'星期一'),
       round(sysdate,'YEAR'),round(sysdate,'MONTH'),round(sysdate,'DAY'),round(sysdate),
       trunc(sysdate,'YEAR'),trunc(sysdate,'MONTH'),trunc(sysdate,'DAY'),trunc(sysdate)
  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類型 

--查詢 2015-03-25 11:30:00 時間點時 oay_file 記錄 [时间搓不能>当前时间点 且 不能太早]
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天為準來計算結果的小數部份   

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

--结果:

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


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


4数据库系统相关配置

       sys_context(context,attribute):返回應用上下文特定屬性,其中context指定應用上下文名,attribute指定對應的屬性

select SYS_CONTEXT('USERENV','TERMINAL') terminal,
   SYS_CONTEXT('USERENV','LANGUAGE') language,
   SYS_CONTEXT('USERENV','SESSIONID') sessionid,
   SYS_CONTEXT('USERENV','INSTANCE') instance,
   SYS_CONTEXT('USERENV','ENTRYID') entryid,
   SYS_CONTEXT('USERENV','ISDBA') isdba,
   SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory,
   SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency,
   SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar,
   SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format,
   SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,
   SYS_CONTEXT('USERENV','NLS_SORT') nls_sort,
   SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
   SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,
   SYS_CONTEXT('USERENV','SESSION_USER') session_user,
   SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,
   SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,
   SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,
   SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,
   SYS_CONTEXT('USERENV','DB_NAME') db_name,
   SYS_CONTEXT('USERENV','HOST') host,
   SYS_CONTEXT('USERENV','OS_USER') os_user,
   SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,
   SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,
   SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,
   SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id,
   SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id,
   SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type,
   SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data
 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

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

--结果:

UID                             55
USER                           SZPF
USERENV('ISDBA')        FALSE

 

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

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

select coalesce('','','terry','zhanna'),
       decode('M','W','girl','M','boy','person')
  
  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

select greatest('terry','888','zhanna','666'),
       least('terry','888','zhanna','666'),
       nullif('terry','zhanna'),nullif('1','1')
  from dual

--结果:

greatest('terry','888','zhanna','666') zhanna nullif('terry','zhanna') terry
least('terry','888','zhanna','666') 666 nullif('1','1')

 

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

--展成品料號TE902C BOM下階元件
select lpad(' ',2*level-1)||sys_connect_by_path(bmb03,'|--') "TE902C展BOM元件" 
  from bmb_file
  start with bmb01 = 'TE902C'
  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,...):返回特定數值在統計數值在統計級別中所占的比例

select rank(1530.100000) within group(order by apa31) rank_level,
       dense_rank(1530.100000) within group(order by apa31) dense_rank_level,
       percent_rank(1530.100000) within group(order by apa31) percent_quto
  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:取得排序等級的最後一級,然後使用分組函數匯總該等級的數據,該函數不能夠單獨使用,必須與其它分組函數結合使用

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

--结果:

AP金額最多等級中的最小已付         AP金額最多等級中的最大已付
3500000                                    3500000      

 

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

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

--结果:

姓名 部門 薪水 部門薪水連續加總 部門薪水總計 個人薪水占部門份額% 所有薪水連續加總 所有薪水總計 個人薪水占總和份額%
AX 2G60 33086 33086 138382 23.909 33086 335666 9.857
BX 2G60 77884 110970 138382 56.282 110970 335666 23.203
CX 2G60 27412 138382 138382 19.809 138382 335666 8.166
DX 2G88 56273 56273 197284 28.524 194655 335666 16.765
SS 2G88 70994 127267 197284 35.986 265649 335666 21.15
IP 2G88 39187 166454 197284 19.863 304836 335666 11.674
DS 2G88 30830 197284 197284 15.627 335666 335666 9.185


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

--结果:

姓名 部門 薪水 排序
BX 2G60 77884 1
AX 2G60 33086 2
SS 2G88 70994 1
DX 2G88 56273 2

 

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()依薪水排序

姓名 部門 薪水 排序   姓名 部門 薪水 排序   姓名 部門 薪水 排序
SI 2BSB 8888 1   SI 2BSB 8888 1   SI 2BSB 8888 1
DI 2BSB 6666 2   DI 2BSB 6666 2   DI 2BSB 6666 2
BP 2BSB 6666 2   BP 2BSB 6666 2   BP 2BSB 6666 3
SP 2BSB 3232 4   SP 2BSB 3232 3   SP 2BSB 3232 4

 

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

select apa00,apa13,sum(apa31f),grouping(apa13)   
  from apa_file   
  group by rollup(apa00,apa13)  
  order by apa00,apa13   

--结果:

APA00 APA13                        SUM(APA31F)      GROUPING(APA13)
11 HKD 23731714.84               0
11 NTD 942131               0
11 RMB 22999119.68               0
11 USD 2180               0
11       47675145.52               1
12 HKD 107141459.6               0
12 NTD 119680               0
12 RMB 69738785.2               0
12 USD 92773.7               0
12      177092698.5               1
                                   …           …

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



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

--结果:

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

接單金額

接單金額

接單金額

接單金額

接單金額

….

….

….

with cte_oea_file as  
(select substr(to_char(oea02,'YYYY/MM/DD'),1,7) po_date,oea032 po_custom,sum(oeb14) po_sales  
   from oea_file join oeb_file on oea01 = oeb01  
   where oea032 in ('Tri-Net','AMBER -W','Belkin-C','GTC','SAN SHIN')  
   group by substr(to_char(oea02,'YYYY/MM/DD'),1,7),oea032  
  order by 1,2  
)  
select po_date "接單月份",  
   sum(decode(po_custom,'Tri-Net',po_sales,0))  "Tri-Net",  
   sum(decode(po_custom,'AMBER -W',po_sales,0)) "AMBER -W",  
   sum(decode(po_custom,'Belkin-C',po_sales,0)) "Belkin-C",  
   sum(decode(po_custom,'GTC',po_sales,0)) "GTC",  
   sum(decode(po_custom,'SAN SHIN',po_sales,0)) "SAN SHIN"  
 from cte_oea_file  
 group by po_date  
 order by po_date  
接單月份            Tri-Net       AMBER -W         Belkin-C          GTC          SAN SHIN
2011/08 768796.48 161573.68 14162.5 319450 10250.96
2011/09 566008.26 221550.9 258366.5 268070 8920
2011/10 270341.68 76241.95 147402 85850 9020
2011/11 464575.39 0 284704 469675 15040
2011/12 295007.55 0 140446.2 918000 21250
2012/01 70835.5 0 0 274850 5100
2012/02 148424.53 0 1425 235255 40690
2012/03 179333.31 0 0 638550 55596.4
2012/04 158162.51 0 0 212000 10110
2012/05 0 0 0 220600 30160



http://blog.csdn.net/yihuiworld



你可能感兴趣的:(oracle,sql,数据库,ERP,sql函数,Tiptop)