zoukankan      html  css  js  c++  java
  • oracle GROUP BY rollup

    SQL> select emp_id,month,prd_type_id,amount
    2 from all_sales
    3 where emp_id=21
    4 order by emp_id,month ;

        EMP_ID      MONTH PRD_TYPE_ID     AMOUNT
    ---------- ---------- ----------- ----------
            21          1           4    3034.84
            21          1           3    6034.84
            21          1           2    1034.84
            21          1           5
            21          1           1   10034.84
            21          2           3    1944.65
            21          2           4    2944.65
            21          2           1   15144.65
    注:表中数据太多,只显示了一部分。
    表all_sales存放2003年每个员工每个产品每个月的销量,
    SQL> select emp_id,month,sum(amount)
    2 from all_sales
    3 where emp_id=21
    4 group by emp_id,month
    5 order by month ;

        EMP_ID      MONTH SUM(AMOUNT)
    ---------- ---------- -----------
            21          1    20139.36
            21          2     21578.6
            21          3    30251.32
            21          4     35729.8
            21          5    25358.24
            21          6    28258.56
            21          7    36449.36
            21          8    62639.28
            21          9    49418.28
            21         10    80016.76
            21         11    41018.92
            21         12    36139.36
    用ROLLUP 进行分组

    SQL> select emp_id,month,sum(amount)
    2 from all_sales
    3 where emp_id=21
    4 group by rollup(emp_id,month) ;

        EMP_ID      MONTH SUM(AMOUNT)
    ---------- ---------- -----------
            21          1    20139.36
            21          2     21578.6
            21          3    30251.32
            21          4     35729.8
            21          5    25358.24
            21          6    28258.56
            21          7    36449.36
            21          8    62639.28
            21          9    49418.28
            21         10    80016.76
            21         11    41018.92
            21         12    36139.36
            21              466997.84
                            466997.84

    ROLLUP(emp_id,month):先对每个EMP_id的每个月的销量
    进行分组求和,相当于GROUP BY EMP_ID,MONTH,得出这个员工,
    每个月的销量总和,然后求这个员工一年所有的销量,相当于
    GROUP BY EMP_ID,最后所求所有员工的销量总和,
    因为查询限制只返回EMP_ID=21的数据,所以
    最后两条记录的值相同。
    group by rollup(emp_id,month) 与group by emp_id,month
    不同之处在于是,group by rollup(emp_id,month) 求得每个员工的
    月销量之后,又多做了两个工作,一是求得每个员一年所有的销量,
    二是求所有员工的年总销量。
    如果除去where emp_id=21,则最后一条记录返回所有员工的总销量,如:
    SQL> select emp_id,month,sum(amount)
    2 from all_sales
    3 group by rollup(emp_id,month) ;

        EMP_ID      MONTH SUM(AMOUNT)
    ---------- ---------- -----------
            21          1    20139.36
            21          2     21578.6
            21          3    30251.32
            21          4     35729.8
            21          5    25358.24
            21          6    28258.56
            21          7    36449.36
            21          8    62639.28
            21          9    49418.28
            21         10    80016.76
            21         11    41018.92
            21         12    36139.36
            21              466997.84
            22          1    21939.36
            22          2     21078.6     
            23          6    15658.56
            23          7    33649.3 
            23         11    30518.92
            23         12    24139.36
            23              323077.84
            24          1    14669.36
            24          2     28878.6
            24          3    35651.32   
            24         10    30116.76
            24         11    22621.92
            24         12    24139.36
            24              333370.84
            25          1     7269.36
            25          2     13678.6     
            25         11    12821.92
            25         12    12639.36
            25              187970.84
            26          1    16568.75   
            26         11    14821.38
            26         12    15639.37
            26              228769.93
                           1972485.13
    数据太多,只显示一部分。
    可以看出,group by rollup(emp_id,month) 为每个员工的销量进行了
    汇总,得出了月销量和年销量(每个员工的最后一条),同时为所有员工进行了汇总,得出所有
    员工的年总销量(最后一条记录)

    函数:grouping 
    接收列作为参数,如果列为空,则grouping返回1,否则返回0,该函数与rollup搭配使用。
    可以使用grouping函数对上述查询进行处理。
    SQL> SELECT DECODE(GROUPING(EMP_ID), 1, '所有员工', EMP_ID) EMP_ID,
    2         nvl2(emp_id,DECODE(GROUPING(MONTH), 1, '员工年度', MONTH),'所有员工年度') ND,
    3         SUM(AMOUNT)
    4    FROM ALL_SALES
    5   GROUP BY ROLLUP(EMP_ID, MONTH)
    6 ; 
    EMP_ID                                   ND                                       SUM(AMOUNT)
    ---------------------------------------- ---------------------------------------- -----------
    21                                       1                                           20139.36
    21                                       2                                            21578.6
    21                                       3                                           30251.32
    21                                       12                                          36139.36
    21                                       员工年度                                   466997.84
    26                                       7                                           12549.36
    26                                       8                                           23139.28
    26                                       9                                           19318.28
    26                                       10                                          26116.99
    26                                       11                                          14821.38
    26                                       12                                          15639.37
    26                                       员工年度                                   228769.93
    所有员工                                 所有员工年度                              1972485.13

  • 相关阅读:
    ibatis $与#的区别
    (转载)Hibernate与Jpa的关系
    tomcat web工程 jar包冲突解决方法
    jquery 获取checkbox 选中值并拼接字符集
    mysql BLOB字段转String的方法
    Ajax工作原理
    Spring mvc 具体RequestMapping 参数含义
    覆盖bootstrap的样式
    开园啦,致曾经现在以后的自己~
    SimpleDateFormat 常规用法
  • 原文地址:https://www.cnblogs.com/ycdx2001/p/3374202.html
Copyright © 2011-2022 走看看