




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Having 這個是用在聚合函數的用法。當我們在用聚合函數的時候,一般都要用到GROUP BY 先進行分組,然后再進行聚合函數的運算。運算完后就要用到HAVING 的用法了,就是進行判斷了,例如說判斷聚合函數的值是否大于某一個值等等。select customer_name,sum(balance)from balancegroup by customer_namehaving balance>200; yc_rpt_getneworder by 、group by 、having的用法區(qū)別 order by 從英文里理解就是行的排序方式,默認的為升序。 order by 后面必須列出排
2、序的字段名,可以是多個字段名。group by 從英文里理解就是分組。必須有“聚合函數”來配合才能使用,使用時至少需要一個分組標志字段。什么是“聚合函數”?像sum()、count()、avg()等都是“聚合函數”使用group by 的目的就是要將數據分類匯總。一般如:select 單位名稱,count(職工id),sum(職工工資) form 某表group by 單位名稱這樣的運行結果就是以“單位名稱”為分類標志統(tǒng)計各單位的職工人數和工資總額。在sql命令格式使用的先后順序上,group by 先于 order by。select 命令的標準格式如下:SELECT select_list
3、 INTO new_table FROM table_source WHERE search_condition GROUP BY group_by_expression HAVING search_condition 1. GROUP BY 是分組查詢, 一般 GROUP BY 是和聚合函數配合使用group by 有一個原則,就是 select 后面的所有列中,沒有使用聚合函數的列,必須出現在 group by 后面(重要)例如,有如下數據庫表:A B 1 abc 1 bcd1
4、60; asdfg如果有如下查詢語句(該語句是錯誤的,原因見前面的原則)select A,B from table group by A該查詢語句的意圖是想得到如下結果(當然只是一相情愿)A B abc 1 bcd asdfg右邊3條如何變成一條,所以需要用到聚合函數,如下(下面是正確的寫法):select A,count(B) a
5、s 數量 from table group by A 這樣的結果就是 A 數量 1 32. Havingwhere 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。having 子句的作用是篩選滿足條件的組,即在分組之后過濾數據,條件中經常包含聚組函數,使用having 條件顯示特定的組,也可以使用多個分組標準進行分組。having 子句被限制子已經在SELECT語句中定義的列和聚合表達式上。通常,你需要通過在HAVING子句中重復聚合函數表達式來引用聚合值,就
6、如你在SELECT語句中做的那樣。例如:SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2Grouping 的用法:指示是否聚合 group by 列表中的指定表達式。在結果集中,如果 Grouping 返回 1 ,表示聚合;如果 Grouping 返回 0 ,表示非聚合。如果指定了 Group by ,那么只能用在 Select , Having , Order by 中。 注釋: GROUPING 用于區(qū)分標準空值和由 ROLLUP 、 CUBE 或 GROUPING SETS 返回的空值。作為 ROLLUP 、 CUB
7、E 或 GROUPING SETS 操作結果返回的 NULL 是 NULL 的特殊應用。它在結果集內作為列的占位符,表示全體。 舉例: CREATE TABLE tt ( 產地 CHAR ( 8), 水果 CHAR ( 8), 重量 INT ) INSERT tt VALUES ( ' 北方 ' , ' 香蕉 ' , 3) INSERT tt VALUES ( ' 北方 ' , ' 水蜜桃 ' , 2) INSERT tt VALUES ( ' 南方 ' , ' 桔子 ' , 3) INSERT t
8、t VALUES ( ' 北方 ' , ' 水蜜桃 ' , 5) INSERT tt VALUES ( ' 南方 ' , ' 香蕉 ' , 3) INSERT tt VALUES ( ' 南方 ' , ' 水蜜桃 ' , 6) INSERT tt VALUES ( ' 北方 ' , ' 桔子 ' , 8) select CASE WHEN ( GROUPING ( 產地 ) = 1) THEN ' 總計 ' ELSE ISNULL ( 產地 ,
9、9;UNKNOWN' ) END AS 產地 , CASE WHEN ( GROUPING ( 水果 ) = 1) THEN ' 小計 ' ELSE ISNULL ( 水果 , 'UNKNOWN' ) END AS 產地 , SUM ( 重量 ) 總重量 FROM TT GROUP BY 產地 , 水果 WITH ROLLUP 結果: /* 北方 桔子 8 北方 水蜜桃 7 北方 香蕉 3 北方 小計 18 南方 桔子 3 南方 水蜜桃 6 南方 香蕉 3 南方 小計 12 總計 小計 30 */ GROUPING(字段)=1的是對應字段匯總的 GROU
10、PING(字段)=0的是對應字段原來的明細的信息 oracle Rollup 和 Cube用法Oracle的GROUP BY語句除了最基本的語法外,還支持ROLLUP和CUBE語句。如果是ROLLUP(A, B, C)的話,首先會對(A、B、C)進行GROUP BY,然后對(A、B)進行GROUP BY,然后是(A)進行GROUP BY,最后對全表進行GROUP BY操作。如果是GROUP BY CUBE(A, B, C),則首先會對(A、B、C)進行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后對全表進行GROUP BY操作。 grouping_
11、id()可以美化效果: Oracle的GROUP BY語句除了最基本的語法外,還支持ROLLUP和CUBE語句。 除本文內容外,你還可參考: 分析函數使用例子介紹:http:SQL> create table t as select * from dba_indexes; 表已創(chuàng)建。 SQL> select index_type, status, count(*) from t group by index_type, status; INDEX_TYPE STATUS COUNT(*) - - - LOB VALID 51 NORMAL N/A 25 NORMAL VALID 4
12、79 CLUSTER VALID 11 下面來看看ROLLUP和CUBE語句的執(zhí)行結果。 SQL> select index_type, status, count(*) from t group by rollup(index_type, status); INDEX_TYPE STATUS COUNT(*) - - - LOB VALID 51 LOB 51 NORMAL N/A 25 NORMAL VALID 479 NORMAL 504 CLUSTER VALID 11 CLUSTER 11 566 已選擇8行。 SQL> select index_type, status
13、, count(*) from t group by cube(index_type, status); INDEX_TYPE STATUS COUNT(*) - - - 566 N/A 25 VALID 541 LOB 51 LOB VALID 51 NORMAL 504 NORMAL N/A 25 NORMAL VALID 479 CLUSTER 11 CLUSTER VALID 11 已選擇10行。 查詢結果不是很一目了然,下面通過Oracle提供的函數GROUPING來整理一下查詢結果。 SQL> select grouping(index_type) g_ind, groupi
14、ng(status) g_st, index_type, status, count(*) 2 from t group by rollup(index_type, status) order by 1, 2; G_IND G_ST INDEX_TYPE STATUS COUNT(*) - - - - - 0 0 LOB VALID 51 0 0 NORMAL N/A 25 0 0 NORMAL VALID 479 0 0 CLUSTER VALID 11 0 1 LOB 51 0 1 NORMAL 504 0 1 CLUSTER 11 1 1 566 已選擇8行。 這個查詢結果就直觀多了,和
15、不帶ROLLUP語句的GROUP BY相比,ROLLUP增加了對INDEX_TYPE的GROUP BY統(tǒng)計和對所有記錄的GROUP BY統(tǒng)計。 就是說,如果是ROLLUP(A, B, C)的話,首先會對(A、B、C)進行GROUP BY,然后對(A、B)進行GROUP BY,然后是(A)進行GROUP BY,最后對全表進行GROUP BY操作。 下面看看CUBE語句。 SQL> select grouping(index_type) g_ind, grouping(status) g_st, index_type, status, count(*) 2 from t group by c
16、ube(index_type, status) order by 1, 2; G_IND G_ST INDEX_TYPE STATUS COUNT(*) - - - - - 0 0 LOB VALID 51 0 0 NORMAL N/A 25 0 0 NORMAL VALID 479 0 0 CLUSTER VALID 11 0 1 LOB 51 0 1 NORMAL 504 0 1 CLUSTER 11 1 0 N/A 25 1 0 VALID 541 1 1 566 已選擇10行。 和ROLLUP相比,CUBE又增加了對STATUS列的GROUP BY統(tǒng)計。 如果是GROUP BY CUB
17、E(A, B, C),則首先會對(A、B、C)進行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后對全表進行GROUP BY操作。 除了使用GROUPING函數,還可以使用GROUPING_ID來標識GROUP BY結果。 SQL> select grouping_id(index_type, status) g_ind, index_type, status, count(*) 2 from t group by rollup(index_type, status) order by 1; G_IND INDEX_TYPE STATUS CO
18、UNT(*) - - - - 0 LOB VALID 51 0 NORMAL N/A 25 0 NORMAL VALID 479 0 CLUSTER VALID 11 1 LOB 51 1 NORMAL 504 1 CLUSTER 11 3 566 已選擇8行。 SQL> select grouping_id(index_type, status) g_ind, index_type, status, count(*) 2 from t group by cube(index_type, status) order by 1; G_IND INDEX_TYPE STATUS COUNT(
19、*) - - - - 0 LOB VALID 51 0 NORMAL N/A 25 0 NORMAL VALID 479 0 CLUSTER VALID 11 1 LOB 51 1 NORMAL 504 1 CLUSTER 11 2 N/A 25 2 VALID 541 3 566 已選擇10行。 grouping_id()可以美化效果: select DECODE(GROUPING_ID(C1), 1, '合計', C1) D1, DECODE(GROUPING_ID(C1, C2), 1, '小計', C2) D2, DECODE(GROUPING_ID(C
20、1, C2, C1 + C2), 1, '小計', C1 + C2) D3, count(*), GROUPING_ID(C1, C2, C1 + C2, C1 + 1, C2 + 1), GROUPING_ID(C1) from T2 group by rollup(C1, C2, C1 + C2, C1 + 1, C2 + 1); = 1.報表合計專用的Rollup函數 銷售報表 廣州 1月 2000元 廣州 2月 2500元 廣州 4500元 深圳 1月 1000元 深圳 2月 2000元 深圳 3000元 所有地區(qū) 7500元 以往的查詢SQL: Select area
21、,month,sum(money) from SaleOrder group by area,month 然后廣州,深圳的合計和所有地區(qū)合計都需要在程序里自行累計 1.其實可以使用如下SQL: Select area,month,sum(total_sale) from SaleOrder group by rollup(area,month) 就能產生和報表一模一樣的紀錄 2.如果year不想累加,可以寫成 Select year,month,area,sum(total_sale) from SaleOrder group by year, rollup(month,area) 另外Ora
22、cle 9i還支持如下語法: Select year,month,area,sum(total_sale) from SaleOrder group by rollup(year,month),area) 3.如果使用Cube(area,month)而不是RollUp(area,month),除了獲得每個地區(qū)的合計之外,還將獲得每個月份的合計,在報表最后顯示。 4.Grouping讓合計列更好讀 RollUp在顯示廣州合計時,月份列為NULL,但更好的做法應該是顯示為"所有月份" Grouping就是用來判斷當前Column是否是一個合計列,1為yes,然后用Decode把
23、它轉為"所有月份" Select Decode(Grouping(area),1,'所有地區(qū)',area) area, Decode(Grouping(month),1,'所有月份',month), sum(money) From SaleOrder Group by RollUp(area,month); 2.對多級層次查詢的start with.connect by 比如人員組織,產品類別,Oracle提供了很經典的方法 SELECT LEVEL, name, emp_id,manager_emp_id FROM employee STA
24、RT WITH manager_emp_id is null CONNECT BY PRIOR emp_id = manager_emp_id; 上面的語句demo了全部的應用,start with指明從哪里開始遍歷樹,如果從根開始,那么它的manager應該是Null,如果從某個職員開始,可以寫成emp_id='11' CONNECT BY 就是指明父子關系,注意PRIOR位置 另外還有一個LEVEL列,顯示節(jié)點的層次 3.更多報表/分析決策功能 3.1 分析功能的基本結構 分析功能() over( partion子句,order by子句,窗口子句) 概念上很難講清楚,還是
25、用例子說話比較好. 3.2 Row_Number 和 Rank, DENSE_Rank 用于選出Top 3 sales這樣的報表 當兩個業(yè)務員可能有相同業(yè)績時,就要使用Rank和Dense_Rank 比如 金額 RowNum Rank Dense_Rank 張三 4000元 1 1 1 李四 3000元 2 2 2 錢五 2000元 3 3 3 孫六 2000元 4 3 3 丁七 1000元 5 5 4 這時,應該把并列第三的錢五和孫六都選進去,所以用Ranking功能比RowNumber保險.至于Desnse還是Ranking就看具體情況了。 SELECT salesperson_id, S
26、UM(tot_sales) sp_sales, RANK( ) OVER (ORDER BY SUM(tot_sales) DESC) sales_rank FROM orders GROUP BY salesperson_id 3.3 NTILE 把紀錄平分成甲乙丙丁四等 比如我想取得前25%的紀錄,或者把25%的紀錄當作同一個level平等對待,把另25%當作另一個Level平等對待 SELECT cust_nbr, SUM(tot_sales) cust_sales, NTILE(4) OVER (ORDER BY SUM(tot_sales) DESC) sales_quartile
27、FROM orders GROUP BY cust_nbr ORDER BY 3,2 DESC; NTITLE(4)把紀錄以 SUM(tot_sales)排序分成4份. 3.4 輔助分析列和Windows Function 報表除了基本事實數據外,總希望旁邊多些全年總銷量,到目前為止的累計銷量,前后三個月的平均銷量這樣的列來參考. 這種前后三個月的平均和到目前為止的累計銷量就叫windows function, 見下例 SELECT month, SUM(tot_sales) monthly_sales, SUM(SUM(tot_sales) OVER (ORDER BY month ROWS
28、 BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) max_preceeding FROM orders GROUP BY month ORDER BY month; SELECT month, SUM(tot_sales) monthly_sales, AVG(SUM(tot_sales) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) rolling_avg FROM orders GROUP BY month ORDER BY month; Windows Function的關鍵就是Windows子句的幾個取值 1 PRECEDING 之前的一條記錄 1 FOLLOWING 之后的一條記錄 UNBOUNDED P
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 郵寄檢驗服務部工作技巧與客戶反饋計劃
- 《貴州美升能源集團有限公司六枝特區(qū)新興煤礦(變更)礦產資源綠色開發(fā)利用方案(三合一)》評審意見
- 膀胱部分切除后護理
- 高中地理 3.1 海水的溫度和鹽度教學實錄2 新人教版選修2
- 2025年三明道路運輸從業(yè)人員從業(yè)資格考試
- 2025年貴州貨運從業(yè)資格證模擬考試保過版
- 《人民幣兌換》(教學設計)-2024-2025學年五年級上冊數學北師大版
- 部隊違規(guī)使用檢討書
- 社區(qū)七夕節(jié)活動方案
- 四年級數學(四則混合運算)計算題專項練習與答案
- 《DeepSeek入門寶典》第4冊·個人使用篇
- 2024年中考模擬試卷數學(新疆卷)
- 2025年蘇州農業(yè)職業(yè)技術學院高職單招高職單招英語2016-2024歷年頻考點試題含答案解析
- 加油站的流程優(yōu)化
- 關于美國地理知識的講課
- 浙江2024年浙江省有色金屬地質勘查院選調專業(yè)技術人員筆試歷年典型考點(頻考版試卷)附帶答案詳解
- 2024云南紅河州個舊市大紅屯糧食購銷限公司招聘及人員易考易錯模擬試題(共500題)試卷后附參考答案
- 開門見山的作文開頭和結尾摘抄
- 新人教版九年級數學第一輪總復習教案
- 2024年安徽省養(yǎng)老護理職業(yè)技能競賽考試題庫(含答案)
- 醉酒后急救知識培訓課件
評論
0/150
提交評論