Oracle中rollup的用法

在047考题中有以下这么一道考题

11.View the Exhibit and examine the descriptions of ORDER_ITEMS and ORDERS tables.

You want to display the CUSTOMER_ID, PRODUCT_ID, and total (UNIT_PRICE multiplied by

QUANTITY) for the order placed. You also want to display the subtotals for a CUSTOMER_ID as well as

for a PRODUCT_ID for the last six months.

Which SQL statement would you execute to get the desired output?

A. SELECT o.customer_id, oi.product_id, SUM(oi.unit_price*oi.quantity) "Total"

FROM order_items oi JOIN orders o

ON oi.order_id=o.order_id GROUP BY ROLLUP (o.customer_id,oi.product_id) WHERE MONTHS_BETWEEN(order_date, SYSDATE) <= 6;

B. SELECT o.customer_id, oi.product_id, SUM(oi.unit_price*oi.quantity) "Total"

FROM order_items oi JOIN orders o

ON oi.order_id=o.order_id GROUP BY ROLLUP (o.customer_id,oi.product_id) HAVING MONTHS_BETWEEN(order_date, SYSDATE) <= 6;

C. SELECT o.customer_id, oi.product_id, SUM(oi.unit_price*oi.quantity) "Total"

FROM order_items oi JOIN orders o

ON oi.order_id=o.order_id GROUP BY ROLLUP (o.customer_id, oi.product_id) WHERE MONTHS_BETWEEN(order_date, SYSDATE) >= 6;

D. SELECT o.customer_id, oi.product_id, SUM(oi.unit_price*oi.quantity) "Total"

FROM order_items oi JOIN orders o

ON oi.order_id=o.order_id WHERE MONTHS_BETWEEN(order_date, SYSDATE) <= 6 GROUP BY ROLLUP (o.customer_id, oi.product_id) ;

Answer: D

上面这道题中其实要选择正确的答案是很简单的,就是group by应该放在where的后面,但是题目中 出现的一个知识点需要我们注意,就是rollup的使用。

大家都熟悉group by基本语法,例如要统计每个部门的员工最高的工资,就可以使用

select max(sal) from emp group by deptno;

但是如果出现比较复杂的统计,单单靠group by基本用法是不能满足的需求的,还得配合rollup一 起来使用,例如:

需要安装职位,经理,部门来统计员工的总工资,并且对职位,经理做一个子统计

SQL> select job,mgr,deptno,sum(sal)  from emp where deptno in(10,30)  group by rollup(job,mgr,deptno);

JOB                                MGR     DEPTNO   SUM(SAL)

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

CLERK                             7698         30        950

CLERK                             7698                   950

CLERK                             7782         10       1300

CLERK                             7782                  1300

CLERK                                                   2250

MANAGER                           7839         10       2450

MANAGER                           7839         30       2850

MANAGER                           7839                  5300

MANAGER                                                 5300

SALESMAN                          7698         30       5600

SALESMAN                          7698                  5600

JOB                                MGR     DEPTNO   SUM(SAL)

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

SALESMAN                                                5600

PRESIDENT                                      10       5000

PRESIDENT                                               5000

PRESIDENT                                               5000

                                                    18150

16 rows selected.

时间: 2024-11-03 07:33:29

Oracle中rollup的用法的相关文章

oracle中distinct的用法详解_oracle

下面先来看看例子: table表 字段1     字段2    id        name    1           a    2           b    3           c    4           c    5           b 库结构大概这样,这只是一个简单的例子,实际情况会复杂得多. 比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录. select distinct name from table 得到的结果

Oracle中的临时表用法汇总

oracle|临时表 说明:下文中的一些说明和示例代码摘自CSDN,恕不一一指明出处,在此一并对相关作者表示感谢! 如果作者有异议,请来信说明  1 语法 在Oracle中,可以创建以下两种临时表: 1) 会话特有的临时表 CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification> ) ON COMMIT PRESERVE ROWS: 2) 事务特有的临时表 CREATE GLOBAL TEMPORARY <TAB

oracle中to_date详细用法示例(oracle日期格式转换)_oracle

TO_DATE格式(以时间:2007-11-02 13:45:25为例) 1. 日期和字符转换函数用法(to_date,to_char) 复制代码 代码如下: select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual;   //日期转化为字符串  select to_char(sysdate,'yyyy')  as nowYear   from dual;   //获取时间的年  select to_char(sys

Oracle中sys_connect_by_path函数用法

sys_connect_by_path函数主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分,然后连接在一个列中显示 select level ,sys_connect_by_path( id , '/' ) from test start with pid= 1 connect by prior pid = id ; //父id=子id 正树型结构 子id=父id 倒树型结构 select level ,sys_connect_by_path( pid, '/' ) from tes

oracle中interval函数用法详解

一.interval函数 interval函数用于将一个整形值转换成时间值date类型的年月或时分秒. oracle语法: interval 'integer [- integer]' {YEAR | MONTH | DAY | HOUR | MINUTE | SECOND} [(precision)][TO {YEAR | MONTH | DAY | HOUR | MINUTE | SECOND}] 注: 1.年.月.日.时.分.秒可以单独使用. 2.{YEAR | MONTH} to {YE

oracle中REF Cursor用法

1,什么是 REF游标 ?  动态关联结果集的临时对象.即在运行的时候动态决定执行查询.   2,REF 游标 有什么作用?  实现在程序间传递结果集的功能,利用REF CURSOR也可以实现BULK SQL,从而提高SQL性能.   3,静态游标和REF 游标的区别是什么?  ①静态游标是静态定义,REF 游标是动态关联:  ②使用REF 游标需REF 游标变量.  ③REF 游标能做为参数进行传递,而静态游标是不可能的.   4,什么是REF 游标变量?  REF游标变量是一种 引用 REF

ORACLE中ESCAPE关键字用法

ESCAPE用法 1.使用 ESCAPE 关键字定义转义符: 在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符. 2.ESCAPE 'escape_character' 允许在字符串中搜索通配符而不是将其作为通配符使用.escape_character 是放在通配符前表示此特殊用途的字符. select * from a WHERE name LIKE '%aa/%bb%' ESCAPE '/'   P.S:第一个和最后一个%作为通配符,中间的%作为普通字符. 结果为: name -

oracle中lpad函数的用法详解_oracle

oracle中lpad的用法 pad翻译:填充 lpad函数,在字符串的左侧添加指定字符串,用法: www.jb51.net lpad(String ,截取长度,添加的字符串). 说是添加字符串也不准确,比较准确的说法是对String进行截取字符串, 如果截取长度大于String的长度,则在 String的左侧添加字符串进行填补,如果第三个参数未指定,则用空格进行填补. 例如: select lpad('test',10) from dual; 将返回" test" select lp

oracle中 exists 与 in效率及其用法

oracle中 exists 与 in效率及其用法 用not exists 代替not in select * from tsp_product p where not exists(select '' from tsp_orderitem i where p.id=i.product_id) select * from tsp_product p where id not in(select product_id from tsp_orderitem i where p.id=i.produc