(Les15 Generating Reports by GroupingRelated Data)[20171226]

来源:https://www.cnblogs.com/also-brook/archive/2017/12/26/8117546.html
-Advertisement-
Play Games

學習目標: -使用ROLLUP操作符產生小計值 -使用CUBE操作符產生交叉製表 -使用GROUPING函數來標識ROLLUP或CUBE運算符生成的結果集中的聚合級別 -使用GROUPING SETS生成一個相當於UNION ALL方法的結果集 ROLLUP操作符 SELECT [column,] ...


  學習目標:     -使用ROLLUP操作符產生小計值
    -使用CUBE操作符產生交叉製表
    -使用GROUPING函數來標識ROLLUP或CUBE運算符生成的結果集中的聚合級別
    -使用GROUPING SETS生成一個相當於UNION ALL方法的結果集
  ROLLUP操作符     
SELECT [column,] group_function(column) . . .
    FROM <table_name>
    [WHERE  condition]
    [GROUP BY [ROLLUP] group_by_expression]
    [HAVING having_expression]
    [ORDER BY column];
    -ROLLUP操作符可以提取結果集的統計和彙總信息。累積總量可用於報表,圖表和圖形。
    -ROLLUP操作符通過向一個方向移動創建分組,從右到左,在GROUP BY子句中指定的列的列表,然後將這些分組聚合。N+1
    
    註意:
            -GROUP BY ROLLUP(col1,col2,col3,..n)產生組合有N+1個。
     例子一:
        
      10:40:59 SQL> select department_id,job_id,sum(salary)
        10:41:19   2  from emp
        10:41:24   3  where department_id<60
        10:41:44   4  group by rollup(department_id,job_id)  --組合執行的順序:(department_id,job_id) 、(department_id)和()
        10:42:00   5  ;
        DEPARTMENT_ID JOB_ID               SUM(SALARY)
        ------------- -------------------- -----------
           20                 MK_MAN                     12990--這裡是是部門id和job id組合
           20                                            12990--這裡是部門id分組求和
           30                 PU_MAN                     10990
           30                                            10990
           50                 ST_MAN                     36350
           50                                            36350
                                                         60330--這是是總體分組求和。

        已選取 7 個資料列.
   

 

   例子二:         原始數據
                ID NAME ---------- -------------------     370101 A000001     370101 A000002     370102 A000003     370103 A000004     370201 A000006     370202 A000005     370301 A000007     370302 A000008      需產生報表格式:
    ID   COUNT(*) ---------- ----------         37          8       3701          4       3702          2       3703          2     370101          2     370102          1     370103          1     370201          1     370202          1     370301          1               370302          1     可以實現方法:
  
  SELECT DECODE (DECODE (id, NULL, TO_NUMBER (SUBSTR (Id, 0, 4)), id),
                 NULL, TO_NUMBER (SUBSTR (Id, 0, 2)),
                 DECODE (id, NULL, TO_NUMBER (SUBSTR (Id, 0, 4)), id))
            AS "ID",
         COUNT (*)
      FROM T_0927
    GROUP BY ROLLUP (TO_NUMBER (SUBSTR (Id, 0, 2)), TO_NUMBER (SUBSTR (Id, 0, 4)),id)
       ORDER BY 1;

 

CUBE操作符  
SELECT [column,] group_function(column) ...
    FROM  <table_name>
    [WHERE  condition]
    [GROUP BY [CUBE] group_by_expression]
    [HAVING having_expression]
    [ORDER BY column];
 
    -CUBE是一個多維數據集操作符,可以應用於所有的聚合函數(avg,sum,max,min和count)。
    -CUBE用於生成交叉報表的結果集,CUBE在GROUP BY子句中指定的所有可能的組合進行分組小計和總計。2^N次方
    
    註意:
            -GROUP BY CUBE(col1,col2,col3,...n)產生組合有2^N個。
      例子一:
            
        11:02:41 SQL>  select department_id,job_id,sum(salary)
            11:02:41   2  from emp
            11:02:41   3  where department_id<60
            11:02:41   4  group by cube(department_id,job_id)--組合:()、(department_id)、(job_id)和(department_id,job_id)
            11:02:41   5  ;
            DEPARTMENT_ID JOB_ID               SUM(SALARY)
            ------------- -------------------- -----------
                                                 60330--這是總體分組求和
                                  MK_MAN         12990--這是job_id分組求和
                                  PU_MAN         10990
                                  ST_MAN         36350
            20                                   12990--這是department_id分組求和
            20                   MK_MAN          12990--這是department_id和job_id分組求和
            30                                   10990
            30                   PU_MAN          10990
            50                                   36350
            50                   ST_MAN          36350
            已選取 10 個資料列.

        

 

GROUPING函數  
 SELECT [column,] group_function(column) ...,
                    GROUPING(expression)
        FROM <table_name>
        [WHERE conditiion]
        [GROUP BY [ROLLUP|CUBE] group_by_expression]
        [HAVING having_expression]
        [ORDER BY column];
          -GROUPING函數幫助理解分組後CUBE或ROLLUP操作運算。         -GROUPING函數只能使用單列。         -GROUPING函數返回一個值0或1,             --0表示使用CUBE或ROLLUP操作符計算聚合             --1表示沒有被CUBE或ROLLUP操作符計算聚合。          例子一:         
     11:22:13 SQL>  select department_id,job_id,sum(salary),grouping(department_id),grouping(job_id)
        11:22:31   2  from emp
        11:22:31   3  where department_id<60
        11:22:31   4  group by cube(department_id,job_id)
        11:22:31   5  ;
        DEPARTMENT_ID JOB_ID               SUM(SALARY) GROUPING(DEPARTMENT_ID) GROUPING(JOB_ID)
        ------------- -------------------- ----------- ----------------------- ----------------
                                            60330                       1                 1--department_id和job_id都沒被計算聚合
                                  MK_MAN    12990                       1                 0--job_id被計算聚合
                                  PU_MAN    10990                       1                 0
                                  ST_MAN    36350                       1                 0
           20                               12990                       0                 1--department_id被計算聚合
           20                   MK_MAN      12990                       0                 0--department_id和job_id都被計算聚合
           30                               10990                       0                 1
           30                   PU_MAN      10990                       0                 0
           50                               36350                       0                 1
           50                   ST_MAN      36350                       0                 0
        已選取 10 個資料列.
            

 

 

GROUPING SETS操作符        
SELECT [column,] group_function(column) ...
        FROM  <table_name>
        [WHERE  condition]
        [GROUP BY GROUPING SETS( group_by_expression)]
        [HAVING having_expression]
        [ORDER BY column]; 
          -指定多維度組合成員,優化ROLLUP或CUBE指定組合。           例子一:             
        11:40:14 SQL>  select department_id,job_id,sum(salary)
            11:40:14   2  from emp
            11:40:14   3  where department_id<60
            11:40:14   4  group by grouping sets((department_id,job_id),(department_id))
            11:40:14   5  ;
            DEPARTMENT_ID JOB_ID               SUM(SALARY)
            ------------- -------------------- -----------
           20 MK_MAN                     12990
           20                            12990
           30 PU_MAN                     10990
           30                            10990
           50 ST_MAN                     36350
           50                            36350

            已選取 6 個資料列.
    例子二:         
11:45:18 SQL>     SELECT DECODE (DECODE (id, NULL, TO_NUMBER (SUBSTR (Id, 0, 4)), id),
        11:45:18   2                   NULL, TO_NUMBER (SUBSTR (Id, 0, 2)),
        11:45:18   3                   DECODE (id, NULL, TO_NUMBER (SUBSTR (Id, 0, 4)), id))
        11:45:18   4              AS "ID",
        11:45:18   5           COUNT (*)
        11:45:18   6      FROM T_0927
        11:45:18   7  GROUP BY GROUPING SETS((SUBSTR (Id, 0, 4)), (SUBSTR (Id, 0, 2)),(ID))
        11:45:18   8              ORDER BY 1;
            ID   COUNT(*)
        ---------- ----------
            37          8
          3701          4
          3702          2
          3703          2
        370101          2
        370102          1
        370103          1
        370201          1
        370202          1
        370301          1
        370302          1

        已選取 11 個資料列.

 

複合欄     如ROLLUP (a,(b,c),d),(b,c)作為複合列在分組計算時被視為一個單元。        ROLLUP(A,(B,C)) 相當於(A,B,C)、(A)和()全體聯合。          例子一:       
  11:48:04 SQL>  select department_id,job_id,employee_id,sum(salary)
        11:54:22   2  from emp
        11:54:22   3  where department_id<60
        11:54:22   4  group by rollup(department_id,(job_id,employee_id))
        11:54:22   5  ;
        DEPARTMENT_ID JOB_ID               EMPLOYEE_ID SUM(SALARY)
        ------------- -------------------- ----------- -----------
                   20 MK_MAN                       201       12990
                   20                                        12990
                   30 PU_MAN                       114       10990
                   30                                        10990
                   50 ST_MAN                       120        7990
                   50 ST_MAN                       121        8190
                   50 ST_MAN                       122        7890
                   50 ST_MAN                       123        6490
                   50 ST_MAN                       124        5790
                   50                                        36350
                                                             60330
        已選取 11 個資料列.
   

 

混合組合     -可以將GROUP BY/ROLLUP/CUBE或GPOUPING SETS混合使用。     如GROUP BY GROUPING SETS(a,b) ,GROUPING SETS(c,d)         GROUP BY <column>,ROLLUP(a),CUBE(b);       例子一:        
 11:55:33 SQL>  select department_id,job_id,employee_id,sum(salary)
        11:59:02   2  from emp
        11:59:02   3  where department_id<60
        11:59:02   4  group by department_id,rollup(job_id),cube(employee_id)
        11:59:02   5  ;
        DEPARTMENT_ID JOB_ID               EMPLOYEE_ID SUM(SALARY)
        ------------- -------------------- ----------- -----------
           20 MK_MAN                       201       12990
           30 PU_MAN                       114       10990
           50 ST_MAN                       120        7990
           50 ST_MAN                       121        8190
           50 ST_MAN                       122        7890
           50 ST_MAN                       123        6490
           50 ST_MAN                       124        5790
           20                              201       12990
           30                              114       10990
           50                              120        7990
           50                              121        8190
        DEPARTMENT_ID JOB_ID               EMPLOYEE_ID SUM(SALARY)
        ------------- -------------------- ----------- -----------
           50                              122        7890
           50                              123        6490
           50                              124        5790
           20 MK_MAN                                 12990
           20                                        12990
           30 PU_MAN                                 10990
           30                                        10990
           50 ST_MAN                                 36350
           50                                        36350
            已選取 20 個資料列.

 

  

 

學習總結:         -學習ROLLUP、CUBE操作符功能、方法和之間的不同點。         -學習GROUPING函數功能,用於區別單列是否被計算聚合(1/0)。         -學習GROUPING SETS操作符用於指定多維度的組合成員,進一步優化ROLLUP/CUBE操作符。         -學習在操作符內採用複合列來限制組合操作。         -學習混合維度查詢。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • echo:Display a line of text,預設會加換行。 -e:escape轉義特殊字元 -n:不要在最後自動換行 no LR cp:文件複製,規則:只有最後一個為目標,複製一個文件到一個文件 或者 多個文件到一個目錄! -r:遞歸複製目錄 -i:互動式顯示覆制 -f:強制複製,覆蓋 ...
  • [20171225]變態的windows批處理4.txt--//昨天學習windows 批處理的echo &.使用它可以實現類似回車換行的功能.例子:1.echo &.R:\>echo 1111 & echo 222211112222--//但是如果寫成如下:R:\>echo 1111 & echo ...
  • 一、yum 簡介 yum,是Yellow dog Updater, Modified 的簡稱,是杜克大學為了提高RPM 軟體包安裝性而開發的一種軟體包管理器。起初是由yellow dog 這一發行版的開發者Terra Soft 研發,用python 寫成,那時還叫做yup(yellow dog up ...
  • http://hadoop.apache.org/docs/r2.9.0/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html 背景 在Hadoop 2.0.0以前,在一個HDFS集群中NameNode存在單點故障。每個集群 ...
  • http://hadoop.apache.org/docs/r2.9.0/hadoop-project-dist/hadoop-hdfs/Federation.html Background HDFS有兩個主要的層: Namespace 由目錄、文件和塊組成 它支持所有的文件系統命名空間操作,比如, ...
  • 這邊將日誌信息記入資料庫時,發現資料庫日誌具體時間丟失,只保留了日期。 我這邊環境是(SRPINGMVC+Mybatis,mysql版本5.6.28以上),java層使用類型為java.util.Date,數據欄位類型為date 參考了一些網上的說法,基本描述是說: date:只有日期,沒有時間,2 ...
  • 需要查兩個表之間的差集 首先,想到的是主鍵直接not in 好吧!這個是可以,但是數據多了的話,想到這個查詢的邏輯有點受不住 於是再改為下麵的這樣: 利用了left join的,然後進行對比,並且利用where進行篩選。 後面也在網上找了這條: 概念上與第二條同理。 好吧! 回顧了一下left jo ...
  • Redis概述 Redis是一種key-value型資料庫,運行於記憶體中,與它相似的資料庫有memcached,現在基本被Redis替代。 Redis適用場景 我們要與傳統的關係型資料庫進行對比才能更好的瞭解與使用Redis 1.高併發場景, redis是個單線程的程式對於純記憶體操作如hash查找可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...