1. 程式人生 > >Oracle SQL:select各類查詢語句總結

Oracle SQL:select各類查詢語句總結

SQL查詢語句總結

資料查詢語言:DML(Data Mannipulation Language)資料操縱語言,用於查詢、操縱資料表資料行

本手冊所有示例引用表均以TIPTOP GP  ERP資料庫表為基礎演示,


1SELECT 查詢所有列資料或特定列資料

--查詢訂單產品,產品品名資料
SELECT oeb04,oeb06 FROM oeb_file;
OEB04                   OEB06

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

J00020853            F3D111-15

J00020886            F2A036-25

J00020901            F2A046b10-GLD

J00020901            F2A046b10-GLD

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

2distinct消除查詢結果的重複行

--查詢訂單產品,產品品名資料,且結果消除重複行(請對比SQL示例1)
SELECT DISTINCT oeb04,oeb06 FROM oeb_file;

OEB04                   OEB06

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

J00020853            F3D111-15

J00020886            F2A036-25

J00020901            F2A046b10-GLD

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

3在SELECT查詢資料列上使用算術表示式(+、-、*、/)及as應用使用列別名
--as指定列別名(列別名也可以不使用as,直接在查詢列後面指定即可),及SQL中使用乘法運算*
SELECT oeb01 as "訂單單號", oeb04 as "訂單產品",oeb06 as "產品品名",oeb12*oeb13 as "訂單金額"
 FROM oeb_file

訂單單號               訂單產品        產品品名                              訂單金額

ZE1-11070001    J01960002    USB 2.0成品                          288
ZE1-11070002    J00130953    AIC-BF-3300BK-500-J          10000
ZE1-11070007    J01960001    USB2.0 CABLE                      62500

注意:如果取了別名,此別名是不能在WHERE 子句中引用的,必須使用原運算式或內嵌表解決

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

4、nvl函式或nvl2函式 處理算術表示式運算中欄位空值問題

     如果查詢的欄位參與+ - / *算術運算,只要參與運算的欄位有一個為空值,則會導致整個運算結果為空值

     nvl(expr1,expr2)如果expr1不為空,則返回expr1,否則返回expr2;expr1與expr2可以是任意資料型別,但是expr1與expr2需是相同的資料型別

     nvl(expr1,expr2,expr3)如果expr1不為空,則返回expr2,否則返回expr3;expr1可以是任意資料型別,但是expr2與expr3需是相同的資料型別

--沖銷數量ta_oeb013欄位有空值現象 ,ta_oeb013為本公司客制欄位(沖銷數量)
SELECT oeb01 as "訂單單號", oeb04 as "訂單產品",oeb06  as "品名",oeb12-oeb24-ta_oeb013  as "訂單未交量"  FROM oeb_file 

訂單單號                訂單產品          品名                                         訂單未交量

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

ZC1-11040001      J00020430      A3X126x50-YLW-M               
ZC1-11050001      ABCDEFGH     插頭                                         10


-- 用nvl函式處理空值問題 ,ta-oeb013 為本司客制欄位沖銷數量,值為空
SELECT oeb01 as "訂單單號", oeb04 as "訂單產品",oeb06  as "品名",oeb12-oeb24-nvl(ta_oeb013,0) as "訂單未交量"  FROM oeb_file  
--或
-- 用nvl2函式處理空值問題 ,ta-oeb013 為本司客制欄位沖銷數量,值為空
SELECT oeb01 as "訂單單號", oeb04 as "訂單產品",oeb06  as "品名",
       nvl2(ta_oeb013,oeb12-oeb24-ta_oeb013,oeb12-oeb24) as "訂單未交量"  FROM oeb_file

訂單單號                訂單產品          品名                                         訂單未交量

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

ZC1-11040001      J00020430      A3X126x50-YLW-M                100
ZC1-11050001      ABCDEFGH     插頭                                         10

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

5、使用WHERE條件子句

      常用的WHERE條件如下:

          等於:=                   不等於:<>,!=            大於:>         

          大於或等於:>=       小於或等於:<=            小於:<

          匹配於列表值:IN( )  

在兩值之間:BETWEEN .. AND ..

          測試是否為NULL:IS NULL (注意:"沒有空格"、"一個或多個空格" 與 IS NULL 是不同的)

          匹配於字元樣式:LIKE,執行模糊查詢需要使用LIKE,常用LIKE萬用字元如下:

               %:匹配0個或多個字元

                _ :匹配單個字元

               如果模糊查詢本身要查的欄位資料裡面包含有'%'或'_'字元時,則需要使用轉義字元ESCAPE

          注意:如果某值是空則並不能用LIKE "%"匹配的到,寫SQL查異常這點經常出錯

      常用的WHERE條件邏輯操作符如下:

          邏輯與:AND,邏輯或:OR,取反:NOT

--查詢Tiptop GP使用者賬號中帶有'_'下劃線的使用者資訊,escape用'a'做轉義字元且2011/03月期間開通的賬號
SELECT * FROM zx_file  
  WHERE zx03 = '2G69' AND zx01 LIKE '%a_%' ESCAPE 'a'    
    AND zxdate BETWEEN to_date('2011/03/01','YYYY/MM/DD') AND to_date('2011/03/31','YYYY/MM/DD')
ZX01           ZX02           ZX03       ZX04

---------      ----------      ------       ----------
top_test     測試帳號      2G69       CLASS-A 

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

6、ORDER BY desc (升序排序:預設),ORDER BY asc (降序排序)  將查詢出來的資料排序

      排序時也可以指定多列排序、非選擇資料欄位排序、別名排序、列位置編號排序

SELECT zx01,zx02 as "姓名",zx03,zx04 FROM zx_file  
 WHERE zx03 = '2G69' or zx03 = '2G60'  
 ORDER BY zx01 asc,"姓名",3 asc,zx09 desc  --不同列排序必須分別指定排序規則

ZX01         姓名             ZX03         ZX04
---------     -----------    --------      ----------

cmtest      C-M-測試    2G60        CLASS-B
tiptop       tiptop          2G69 
top_test    測試賬號      2G60        CLASS-A
toptest     測試賬號      2G69        CLASS-C

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

7、連線查詢:基於2個或2個以上的檢視或表的查詢

說明:必須在FROM子句後接上2個或2個以上的表或檢視

          查詢的資料列如果在FRM子句後面所捷的表或檢視有多個,則必須在查詢的資料欄位前面加上表或檢視名作為首碼,否則會引起2意性錯誤

          當使用連線查詢時必須在WHERE子句中指定連線的條件,否則會產生笛卡爾積(X*Y)

          使用別名可以簡化SQL的編寫,別名必須跟在表或檢視的後面

     7.1、簡單連線查詢:FROM子句接 表或檢視,WHERE子句指定連線條件

----查詢tiptop GP系統使用者帳號和部門資訊
SELECT zx_file.zx01,zx_file.zx02,zx_file.zx03,gem_file.gem02   
  FROM zx_file,gem_file  
 WHERE zx_file.zx03 = gem_file.gem01  
--等同於
----查詢tiptop GP系統使用者帳號和部門資訊
SELECT zx01,zx02,zx03,gem02   
  FROM zx_file,gem_file  
 WHERE zx03 = gem01

ZX01      ZX02     ZX03     GEM02

-------    -------     -----           ---------
terry       李帥        2G69     海外資訊
zhanna  詹妹       2G89     會計部


      7.2、內連線INNER JOIN、左外連線LEFT JOIN、右外連線RIGHT JOIN、完全外連線FULL JOIN、+操作符

                內連線INNER JOIN:用於返回滿足條件的所有記錄,預設情況下在執行查詢如果沒有指定任何連線操作,則此查詢SQL即為內連線

--查詢tiptop系統使用者資訊
--Oracle 9i 之前的語法,連線條件在WHERE子句中
SELECT zx01 as "使用者ID",zx02 as "使用者姓名",zx03 as "部門ID",gem02 as "部門簡稱"   
  FROM zx_file,gem_file  
 WHERE zx03 = gem01  
--等同於
--Oracle 9i 之後的語法法,使用join或是inner join,連線條件寫在on子句中,join子句指定連線的表或檢視   
SELECT zx01 as "使用者ID",zx02 as "使用者姓名",zx03 as "部門ID",gem02 as "部門簡稱"   
 FROM zx_file 
 JOIN gem_file ON zx03 = gem01 --或使用inner join

使用者ID      使用者姓名   部門ID     部門簡稱
--------      ---------    --------     ----------

terry        李帥          2G69       海外資訊
zhanna    詹妹          2G89       會計部


                左外連線LEFT JOIN/LEFT OUTER JOIN:不僅返回滿足連線條件的結果集而且返回不滿足連線條件的但是位於連線操作符 表或檢視的結果集
SELECT zx01,zx02,zx03,gem02 FROM zx_file  
  LEFT JOIN gem_file ON zx03 = gem01  --或 left outer join  
--等同於如下使用+操作符的SQL語句
SELECT zx01,zx02,zx03,gem02   
  FROM zx_file,gem_file 
 WHERE zx03 = gem01(+) --使用+操作符進行左外連線 等同 left join  .. on .. 注意+的位置

--例如 qintan 使用者的部門編號不存在gem_file,chris 使用者部門資訊為空
ZX01        ZX02     ZX03    GEM02

---------    ------     ------    ----------
terry        李某        2G69    海外資訊
zhanna    詹妹      2G89    海外會計
qintan     情            2M30
chris        chris


                 右外連線RIGHT JOIN/RIGHT OUTER JOIN:不僅返回滿足連線條件的結果集而且返回不滿足連線條件的但是位於連線操作符 表或檢視的結果集

SELECT zx01,zx02,zx03,gem02 FROM zx_file  
 RIGHT JOIN gem_file on zx03 = gem01  --或 right outer join  
--等同於如下使用 + 操作符的SQL語句
SELECT zx01,zx02,zx03,gem02   
  FROM zx_file,gem_file  
 WHERE zx03(+) = gem01    --使用+操作符進行右外連線 等同 right join .. on .. 注意+的位置

ZX01     ZX02    ZX03    GEM02

--------    ------     ------      ---------
terry      李某     2G69    海外資訊
zhanna 詹妹     2G89    海外會計 
                                          行政部
                                          企劃科


                  完全外連線FULL JOIN/FULL OUTER JOIN:不僅返回滿足連線條件的結果集而且返回不滿足連線條件的位於連線操作符 左 右邊表或檢視的結果集
SELECT zx01,zx02,zx03,gem02 FROM zx_file  
 FULL JOIN gem_file ON zx03 = gem01  --或 full outer join

ZX01      ZX02   ZX03    GEM02

---------  ------     ------       --------- 
terry       李某    2G69     海外資訊
zhanna  詹妹    2G89    海外會計 
qintan    情        2M30   
chris      christ      
                                           行政部
                                            企劃科

      7.3、+操作符:Oracle 9i之前的語法,現在已經不建議使用了,+出現在列的哪一邊則哪一邊的資料可以不一定要存在

                 +操作符 只能夠出現在where子句中,且不能同時跟OUTER JOIN語法一起使用

                 +操作符 只能夠實現左外連線(LEFT JOIN)及右外連線(RIGHT JOIN),但是不能夠實現完全外連線

                 +操作符 只能使用在列上,不能夠使用在運算式上

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

8、自連線查詢:同一張表之間的連線查詢,主要用在自參照表上顯示同一張表不同欄位列的關係

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

9、子查詢:也稱巢狀查詢,是指嵌入在其他SQL語句中的SELECT語句

      注意:當在DDL語句中引用子查詢時可以帶有ORDER BY子句,但是當在WHERE子句、SET子句中引用子查詢時則不可以帶有ORDER BY子句

應用:通過在WHERE、HAVING、START WITH子句中使用子查詢可以提供條件值

                通過在UPDATE語句中使用子查詢可以修改一列或多列資料

                通過在INSERT或CREATE TABLE語句中使用子查詢可以將來源表資料插入到目標表中

                通過在CREATE VIEW或是CREATE MATERIALIZED VIEW中使用子查詢可以定義檢視

      9.1、單行子查詢:只返回一行資料的子查詢

--查詢部門簡稱為"ERP"的所有賬號資訊
SELECT zx01,zx02,zx03 FROM zx_file  
 WHERE zx03 = (SELECT gem01 FROM gem_file WHERE gem02 = 'ERP')

ZX01          ZX02        ZX03

--------       ----------   ------
toptest      測試賬號   2G69
terry          李某          2G69

       9.2、多行子查詢:只返回多行資料的子查詢

                 當在WHERE子句中使用多行子查詢時,必須使用多行比較符IN、ALL、ANY

                 IN:匹配子查詢結果中的任意一個值即可

                 ALL:必須要符合子查詢結果中的所有值,    不能單獨使用,需配合單行比較符(=,>,<.>=,<=,<>,!=)使用

                 ANY:只要符號子查詢結果中的任意值即可,不能單獨使用,需配合單行比較符(=,>,<.>=,<=,<>,!=)使用

                 多行子查詢中使用IN操作符

--查詢部門別存在部門資訊gem_file中且部門編號是2G開頭的人員賬號資訊
SELECT zx01,zx02,zx03 FROM zx_file  
 WHERE zx03 IN (SELECT gem01 FROM gem_file WHERE gem01 LIKE '2G%')
ZX01       ZX02        ZX03

--------    ---------    ------ 
toptest   測試賬號   2G69
terry       李某          2G69
zhanna   詹妹          2G89
pIG         XYZ           2G80

                  多行子查詢中使用ALL操作符

--查詢內銷訂單中接單金額>所有外銷訂單金額的訂單明細 
SELECT oea01 as "訂單",oeb04 as "產品",oeb12*oeb13 as "金額" FROM oeb_file,oea_file  
  WHERE oea01= oeb01 
    AND oea08 = '1' 
    AND (oeb12*oeb13 > ALL (
                             SELECT oeb12*oeb13 FROM oeb_file   
                               WHERE oea01 = oeb01 AND oea08 = '2'  
                           )
        )
訂單                      產品                                       金額

-----------------     ----------------------------         ---------
ZX1-11100659    12P0016W302111173             34000
ZX1-11100658    12P0010211-00111                 14460
ZX1-11120228    35PT021120-001554               16080
ZX1-12010058    12P6000CW30201173             81000

                    多行子查詢中使用ANY操作符

--查詢接單金額等於任意一個以ZE1-1106開頭的訂單的接單金額的訂單明細  
SELECT oeb01 as "訂單",oeb04 as "產品",oeb12*oeb13 as "金額" FROM oeb_file  
  WHERE oeb12*oeb13 = ANY(
                          SELECT oeb12*oeb13 FROM oeb_file WHERE oeb01 like 'ZE1-1108%'
                         )

訂單                      產品                                       金額

-----------------     ----------------------------         ---------
ZZ1-13100639    15P001XXXX02111173           78000
ZZ1-13100698    12P58912211-00111              88000

           9.3多列子查詢:多列資料必須同時匹配

                     區別  單行子查詢多行子查詢多列子查詢

                       單行子查詢:返回單列單行資料,針對 單列

                       多行子查詢:返回單列多行資料,針對 單列

                       多列子查詢:返回多列資料的子查詢,針對 多列

                                         可以返回 多列單行資料,此時WHERE子句可以使用單行比較符如=.....,查詢返回多列成對匹配的結果

                                         可以返回 多列多行資料,此時WHERE子句可以使用多行比較符如IN.....,查詢返回多列成對匹配的結果

--查詢未轉工單的訂單+項次  
SELECT oeb01 as "未轉工單訂單",oeb03 as "訂單項次",oeb04 as "產品",oeb06 as "品名"  
   FROM oeb_file  
  WHERE (oeb01,oeb03) NOT IN (select sfb22,sfb221 FROM sfb_file) --此處(oeb01,oeb03)會與sfb22,sfb221成對匹配

未轉工單訂單      訂單項次      產品                             品名

-----------------   ----------      ---------------------- -    -----------------------------------
SY1-11080005   1                 WZ110309990GCD     DVI 18+1 To DVI 18+1 黑色
SY1-11080006   1                 WZ110309930GCD     HDD 15M To HDD 15M黑色
SY1-11080007   1                 W11031010-0G           D-SUB 15P M to D-SUB 15P M

             9.4、在FROM子句中使用子查詢:FROM子句中使用的子查詢,該子查詢會被當做檢視看待,也稱內嵌檢視

--查詢2013年3月 薪資高於或等於本部薪資平均水平的人員  
SELECT cqk_file.cqk05 as "部門編號",cqk09 as "員工姓名",cqk30 as "薪資",avgsalary as "部門均資" 
 FROM cqk_file, 
               (SELECT cqk05,avg(cqk30) avgsalary FROM cqk_file  
                  WHERE cqk03 = 2012 and cqk031 = 3  
                GROUP BY cqk05
                )avg_salary  
  WHERE cqk_file.cqk05 = avg_salary.cqk05  
    AND cqk_file.cqk30 >= avg_salary.avgsalary  
    AND cqk03 = 2013 AND cqk031 = 3

部門編號   員工姓名               薪資                      部門薪資

---------    ----------               ----------------        ---------
2SF0        劉SIR                    77884.000000      46127
2N10       黃SIR                    56621.000000      22816
2B22        陳SIR                    86197.000000      86197

             9.5、相關子查詢EXISTS

                      相關子查詢是指需要應用主查詢列表中的子查詢語句,需要通過謂詞EXISTS來實現

                      當使用EXSISTS謂詞時,如果子查詢存在返回結果則條件返回TRUE,否則返回FALSE

--查詢部門存在於部門別gem_file中且部門編號為2G69的tiptop系統使用者 
SELECT zx01,zx02,zx03 FROM zx_file   
  WHERE EXISTS                             
  (  
     SELECT 1 FROM gem_file WHERE zx_file.zx03 = gem_file.gem01 AND gem01 = '2G69'  
  ) --使用EXISTS,因為gem_file有2G69部門資訊,所以子查詢返回的條件為true

ZX01       ZX02           ZX03

--------    -----------     ------ 
cmtest    C-M-TEST   2G69
terry       李某             2G69

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

10、合併查詢:為了合併多個查詢結果可以使用UNION、UNION ALL、INTERSECT、MINUS

      語法:SELECT 語句1 [UNION |UNION ALL |INTERSECT | MINUS] SELECT 語句2

      說明:這些集合操作符具有相同的優先順序,當同時使用多個操作符時會按照從左到右的方式應用這些集合操作符

                使用集合操作符時必須確保不同的查詢語句查詢的列的個數相同且型別也必須匹配

                子句不能有ORDER、GROUP,必須放在整個語句的末尾

      UNION:獲取兩個結果的並集,且去掉合併結果中重複的記錄

--UNION應用:查詢tiptop系統使用者名稱以ta開頭和部門編號是2G69的所有使用者
SELECT zx01,zx02,zx03 FROM zx_file WHERE zx01 LIKE 'te%'
 UNION
SELECT zx01,zx02,zx03 FROM zx_file WHERE zx03 = '2G69'
ZX01        ZX02           ZX03

--------     -----------     ------ 
cmtest     C-M-測試    2G69
terry        李某             2G69
tiptop                         2G69
toptest    測試賬號      2G69

      UNION ALL:獲取兩個結果的並集,但去掉合併結果中重複的記錄

--UNION ALL應用:查詢tiptop系統使用者名稱以ta開頭和部門編號是2G69的所有使用者
SELECT zx01,zx02,zx03 FROM zx_file WHERE zx01 LIKE 'te%'
 UNION ALL  --注意查詢結果與UNION的區別
SELECT zx01,zx02,zx03 FROM zx_file WHERE zx03 = '2G69'

ZX01        ZX02           ZX03

--------     -----------     ------ 
cmtest     C-M-測試    2G69
terry        李某             2G69

terry        李某             2G69 
tiptop                         2G69
toptest    測試賬號      2G69

      INTERSECT:取兩個結果的交集

--INTERSECT應用:查詢tiptop系統使用者名稱以ta開頭且部門編號是2G69的所有使用者
SELECT zx01,zx02,zx03 FROM zx_file WHERE zx01 LIKE 'te%'
 INTERSECT
SELECT zx01,zx02,zx03 FROM zx_file WHERE zx03 = '2G69'

ZX01        ZX02           ZX03

--------     -----------     ------ 
terry        李某             2G69

      MINUS:獲取兩個結果集的差集,返回在第個結果集中存在但是第個結果集中不存在的記錄

--MINUS應用:注意查詢結果和上述的差別
SELECT zx01,zx02,zx03 FROM zx_file WHERE zx01 LIKE 'te%'
 MINUS
SELECT zx01,zx02,zx03 FROM zx_file WHERE zx03 = '2G69'
ZX01        ZX02           ZX03

--------     -----------     ------ 
cmtest     C-M-測試    2G69
tiptop                         2G69
toptest    測試賬號      2G69

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

11、資料分組查詢統計

        實際應用中常需要做的就統計資料庫中的資訊,按照指定列分組群以比較各組群的差異資訊

        Oracle資料分組通過使用GROUP BY子句指定要分組的列

                                     使用分組函式如COUNT、AVG、SUM、MAX、MIN等顯示統計結果

                                     使用HAVING子句限制分組顯示結果(注意:having後面必須接分組函式)

        如果查詢有分組函式計算,則先將WHERE條件符合的資料計算,HAVING子句只是顯示分組顯示的結果,不參與分組函式的計算

        常用分組函式

        MAX:取得列或運算式的最大值,適用於任何資料型別               MIN:取得列或運算式的最小值,適用於任何資料型別

 AVG:取得列或運算式的平均值,適用於任何資料型別                 SUM:取得列或運算式的總和,只適用於數字型別

        COUNT:取得行數

        VARIANCE:取得列或運算式的方差,只適用於數字型別            STDDEV:取得列或運算式的偏差,只適用於數字型別

        注意:分組函式 只能夠 出現在選擇列表、ORDER BY、HAVING子句中,不能出現在 WHERE和GROUP BY子句中

                  除了COUNT(*)之外,其他分組函式都會忽略NULL行

                  執行SELECT語句時,選擇列必須出現在GROUP BY子句中

--查詢所有部門不同年月中的部門最低、平均、最高薪資,且部門當年月份領薪人員數>=3個  
SELECT cqk05,cqk03,cqk031,MIN(cqk30),AVG(cqk30),MAX(cqk30) 
  FROM cqk_file  
 --where cqk03 = 2012 and cqk031 = 3   
 GROUP BY cqk05,cqk03,cqk031      --多列分組   
 HAVING COUNT(distinct cqk09)>=3  
 ORDER BY 1 DESC,2 ASC,3 ASC

CQK05         CQK03      CQK031  MIN(CQK30)     AVG(CQK30)      MAX(CQK30) 

-------          -------         --------     -------------      --------------       ----------------  
2SF1            2012            3                   52210              52210                  52210          
2SF1            2012            4                   52210              52210                  52210          
2S90            2012            3                   24333             48421                   72509          
2S90            2012            4                   26806             49657.5                 72509          
2S80            2012            3                   26345             45312                   64279          
2S80            2012            4                   28848             46563.5                 64279

        ROLLUP生成橫向統計資訊

--統計2G80部門各人員所有年月內的均資、最低薪資、最高薪資   
SELECT cqk09,AVG(cqk30),MIN(cqk30),MAX(cqk30) FROM cqk_file  
 WHERE cqk05 = '2G80'  
 GROUP  BY ROLLUP (cqk09) --rollup 均資再平均,最低再求最低,最高再求最高
CQK09     AVG(CQK30)      MIN(CQK30)       MAX(CQK30)

-------      ---------------      ---------------        --------------- 
張三               83859.25     36156                  90674   
李四         28752.36364     14905                  30300   
王五         31184.58333     6579                    33494   
趙六                    23942     16405                  31479   
錢七                    45496     23480                  47702   
王八               29241.25     29218                  29249   
九九                    38760     38760                  38760   
黃十               36462.75     36432                   36473   
匡二                    16833     16833                  16833   
劉一         56484.66667     54809                   56665   
                41848.31707     6579                     90674

        GROUPING SETS 按多行多列分別統計資訊

--查詢統計2013/08/15日各訂單的接單本幣金額及各幣種的金額分佈
SELECT oea01 as "訂單號碼",oea23 as "原幣幣別",SUM(oeb14*oea24) as "金額統計" 
  FROM oeb_file
  JOIN oea_file ON oea01 = oeb01
 WHERE oea02 >= to_date('2012/04/15','YYYY/MM/DD')
 GROUP BY grouping sets(oea01,oea23)
訂單號碼              原幣幣別      金額統計

-----------------     -----------    --------------- 
ZZ1-12040413                       12573.1584    
KK3-12040009                       19168.812    
ZZ1-12040432                       5739.51     
. . .                                            . . .
                                    HKD   1833838.062    
                                    NTD   145010   
                                    USD   5554649.988  

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

12、如何查詢某時刻點提交的資料資料

        利用在from子句中指定as of子句,在as of子句中指定時間,也可以指定SCN

        前提:資料庫必須採用UNDO管理模式,並且初始化了undo_retention限制undo資料保留的時間

--應用時間點返回歷史查詢資料  
SELECT * FROM oea_file as of timestamp to_timestamp('2012/04/16 11:01:00','YYYY/MM/DD HH24:MI:SS') 
--應用SCN序列號返回歷史查詢資料,需DBA的許可權
SELECT * FROM oea_file as of scn scn序列號

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

13、CASE及遞迴查詢等複雜應用.....

        CASE應用語法:

        CASE 

              WHEN condition1  THEN....

              WHEN condition2  THEN....

              ELSE ....

         END

--CASE語法應用:查詢ERP使用者資訊,判斷其部門資訊
SELECT zx01,zx02,zx03,  
  (CASE   
      WHEN zx03 = '2G69'  
        THEN '資訊部'  
      WHEN zx03 = '2G88' OR zx03 = '2G89'  
        THEN '財務部'  
      WHEN zx03 IS NULL  
        THEN '無部門'  
      ELSE  
        '其他部門'  
   END  
  )department   
  FROM zx_file  
  ORDER by zx01

ZX01      ZX02      zx03      DEPARTMENT

--------   --------   -------     ----------------
acc        會ACC                  無部門
zhanna  詹妹       2G89      財務部
amy72   葉妹       2G21      其他部門
tcx         童哥       2E10      其他部門
terry      李某       2G69      資訊部

      WITH 表名 as (SQL子查詢語句):可以將(SQL子查詢語句複用)

      START WITH ... CONNECT BY PRIOR ... 實現Oracle層次查詢

         START WITH:用於指定層次查詢的起始根行,當然也可以指定末行開始查詢

         CONNECT BY:用於指定父子行關係,在其後必須使用PRIOR引用父行

--遞迴層次顯示料號11MP28440ZZZZ001110-004101的BOM結構
SELECT DISTINCT concat(lpad(' ',3*(level-1)),bmb01)   father_ima,
                concat(lpad(' ',3*(level+1-1)),bmb03) level_ima 
  FROM bmb_file,bma_file
 WHERE bma01=bmb01 AND bma10='2' AND bmb14='0'
 START WITH bmb01 = '11MP28440ZZZZ001110-004101' 
        AND bmb01 IS NOT NULL    AND bmb14='0'
        AND (bmb05 IS NULL OR bmb05>sysdate)
        AND bmb04<=sysdate
 CONNECT BY PRIOR bmb03 =  bmb01  --表示當前料號的bmb03是下階料號的bmb01 
 ORDER BY father_ima DESC

FATHER_IMA                                           LEVEL_IMA

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

11MP28440ZZZZ001110-004101    B01288119000-002587
11MP28440ZZZZ001110-004101    D281NP10100000
11MP28440ZZZZ001110-004101    D282FEP0000001
   B01288119000-002587       D1120080000000
   B01288119000-002587       P50100079000000000-006447
      P50100079000000000-006447          C2418001ZZZZ00114-0009
      P50100079000000000-006447          C2418010ZZZZ00114-0009
         C2418010ZZZZ00114-0009             D281NP10100000
         C2418010ZZZZ00114-0009             D282FEP0000010
         C2418010ZZZZ00114-0009             E01320072801000
         C2418001ZZZZ00114-0009             D281NP10100000
         C2418001ZZZZ00114-0009             D282FEP0000001
         C2418001ZZZZ00114-0009             E01320072801000
            E01320072801000                D1120320000000

--上述11MP28440ZZZZ001110-004101BOM結構中只查尾階原物材料     
WITH cte_level_ima AS   --WITH .. AS SQL子查詢複用
(--遞迴層次顯示料號11MP28440ZZZZ001110-004101的BOM結構
 SELECT DISTINCT concat(lpad(' ',3*(level-1)),bmb01)   father_ima,
                 concat(lpad(' ',3*(level+1-1)),bmb03) level_ima 
   FROM bmb_file,bma_file
  WHERE bma01=bmb01 AND bma10='2' AND bmb14='0'
  START WITH bmb01 = '06000005' 
         AND bmb01 IS NOT NULL    AND bmb14='0'
         AND (bmb05 IS NULL OR bmb05>sysdate)
         AND bmb04<=sysdate
  CONNECT BY PRIOR bmb03=bmb01 --表示當前料號的bmb03是下階料號的bmb01 
  ORDER BY father_ima DESC  
) 
SELECT '11MP28440ZZZZ001110-004101' AS "尾階原物材料" FROM dual
  UNION 
SELECT level_ima AS "尾階原物材料" FROM cte_level_ima
  --where ltrim(' ',cte_level_ima.level_ima) not in (select (ltrim(' ',cte_level_ima.father_ima)) from cte_level_ima)
  WHERE cte_level_ima.level_ima NOT IN (SELECT father_ima FROM cte_level_ima)
  ORDER BY 1 DESC

尾階原物料材料

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

11MP28440ZZZZ001110-004101
   D282FEP0000001
   D281NP10100000
      D1120080000000
            D282FEP0000010
            D282FEP0000001
            D281NP10100000
               D1120320000000



--應用:Tiptop GP ERP axcr610(LCM存貨貨齡分析表),一條SQL搞定30、60、90、180、360天呆滯料表
WITH cte_cma_file AS
(SELECT cma01,cma02,cma03,cma04,cma14,cma15,cmc03,cmc04
   FROM cma_file,cmc_file
  WHERE cma01 = cmc01
    AND cma15 <> 0
    AND cma021 = cmc021 AND cma022 = cmc022
    AND cma02 = to_date('2012/05/31','YYYY/MM/DD')
    AND cma021 = '2012' AND cma022='5'
  ORDER BY cma01,cma02
),
     cte_cma_count AS
(SELECT cma01,
        SUM(cmc04*(CASE WHEN ((cma02-cmc03)>=0    AND (cma02-cmc03)<=30)  THEN 1 ELSE 0 END)) cmc04_t30,
        SUM(cmc04*(CASE WHEN ((cma02-cmc03)>=31   AND (cma02-cmc03)<=90)  THEN 1 ELSE 0 END)) cmc04_t90,
        SUM(cmc04*(CASE WHEN ((cma02-cmc03)>=91   AND (cma02-cmc03)<=180) THEN 1 ELSE 0 END)) cmc04_t180,
        SUM(cmc04*(CASE WHEN ((cma02-cmc03)>=181  AND (cma02-cmc03)<=365) THEN 1 ELSE 0 END)) cmc04_t365,
        SUM(cmc04*(CASE WHEN ((cma02-cmc03)>=366)                         THEN 1 ELSE 0 END)) cmc04_t365UP
   FROM cte_cma_file
  GROUP BY cma01
  ORDER BY cma01
),
     cte_cma_price AS
(SELECT DISTINCT cma01,cma14,cma15
   FROM cte_cma_file
  ORDER BY cma01
)
SELECT cte_cma_count.cma01 "料號",cma14 "月平均加權單價",cma15 "總數量",cma14*cma15 "總金額",
       cmc04_t30    "30天呆滯總數量",   cmc04_t30*cma14    "30天呆滯總金額",
       cmc04_t90    "90天呆滯總數量",   cmc04_t90*cma14    "90天呆滯總金額",
       cmc04_t180   "180天呆滯總數量",  cmc04_t180*cma14   "180天呆滯總金額",
       cmc04_t365   "365天呆滯總數量",  cmc04_t365*cma14   "365天呆滯總金額",
       cmc04_t365UP "365UP天呆滯總數量",cmc04_t365UP*cma14 "365UP天呆滯總金額"
  FROM cte_cma_count,cte_cma_price
 WHERE cte_cma_count.cma01 = cte_cma_price.cma01
 ORDER BY cte_cma_count.cma01



http://blog.csdn.net/yihuiworld