a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 304|回复: 0

[考试辅导] Oracle认证辅导之OracleROLLUP和CUBE用法

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
rollup只有第一个参数起作用也是理解不正确的,先看看例子吧:# o6 U7 T- n$ W9 v$ a* S. y6 R( h7 k
  SQL> select grade,id,num from a;
: B( {; B" T( Z% V+ M* A" h  GRADE ID NUM
! s) A7 M& G$ ^. B3 ^4 p  ---------- ---------- ----------# A$ m+ Q1 a# v+ T$ N8 j
  a 1 1* ~$ x% X" G/ P6 w
  a 2 25 R0 w! Y7 v' h
  b 3 4
9 p, M! b: K5 b( M2 Q% c* U$ `  b 4 44 K! G. R/ u9 H* Z1 f" a6 |
  对grade字段进行rollup:
. o- e7 s/ |( Q9 F- j  SQL> select grade,sum(num) from a group by rollup(grade);1 f* {* ^7 v4 n% t) \9 F
  GRADE SUM(NUM)
& N0 j( Z, o$ D, f1 z  ---------- ----------
5 h# L" N& m( X- }4 E$ K! ]2 T' S  a 3
! |6 D; o& B- H+ Z  b 89 U% x6 d! d0 B5 A6 E, k6 P
  11: _/ b0 }  I/ y( S" ?/ O2 p
  同时对grade和id字段进行rollup
2 F3 I! S+ |9 \) E  SQL> SELECT decode(grouping_id(grade,ID),2,'小计',3,'合计',grade) grade,
% ^9 T. k5 R7 n( {' r  2 decode(grouping_id(grade,ID),1,'小计',3,'合计',ID) ID,
+ q1 `4 a1 n" D8 @0 [' E  3 SUM(num)
. C) P. d; `. I9 b( U  4 FROM a GROUP BY ROLLUP(grade,ID)
+ F- U% l- z% g5 r4 U; R4 _  5 /% k4 c+ L4 W- G- R6 n
  GRADE ID SUM(NUM)% P# y: T$ ~$ [' z+ R0 C: x: X
  ---------- ---------- ----------2 d! s+ Z6 [" g/ B( a) w" U
  a 1 18 p4 T/ G! u) j9 x8 X% D8 T8 L6 h
  a 2 2
- t: H6 W/ x7 E% e5 R  a 小计 3
. y. J+ J8 I6 S4 S  b 3 4! ?/ ?# J4 c' I* b! W
  b 4 4" n  c: L5 N- I' G5 V$ g3 e; p
  b 小计 8
- U& {6 L$ g5 x* Z  合计 合计 11) x5 a2 y1 n/ q& v- c: e3 X8 U/ Z
  7 rows selected
4 W6 E/ c7 P. r  N4 Z8 h6 i  再看看先对grade分组,再对id进行rollup的情况:6 M  {& O4 k+ v6 n9 w
  SQL> SELECT grade,
  d" B& e: T# ]8 ~1 P" T  2 decode(GROUPING(ID),1,'合计',ID) ID,
2 w3 o- `' H1 _3 n; O  3 SUM(num)$ p3 P% [$ `. |6 B
  4 FROM a GROUP BY grade,rollup(ID)
7 |: @1 x( A! Q9 z  5 /
( J/ W1 B' X0 T  I  j  GRADE ID SUM(NUM). e1 T3 i+ \( F. I9 b* l9 @, n
  ---------- ---------- ----------: N- P0 ^$ i6 W' M+ t' ^$ E- t
  a 1 17 x# m! G9 B3 U0 G! a
  a 2 2
+ r- C. ~( X6 S; `. ]! j  a 合计 37 O8 O) X6 m4 F, Q; Z$ l
  b 3 48 ?( Z( E0 y" Q& Y0 A2 G' m
  b 4 4
  n+ F% h: Q( @2 u. [! K  b 合计 8
3 D% S3 v5 k  [8 p" z) Y0 y7 l  6 rows selected, f5 {2 U# Z7 j- t/ B: M
  这里GROUP BY grade,rollup(ID)跟你的理解应该很相近了,而且可以看出GROUP BY grade,rollup(ID)结果跟ROLLUP(grade,ID)很类似,只是少了最后1行总合计,但是也可以就看出rollup多个字段时并不是只有1个字段起作用的
( d/ m2 M5 J5 @* g! Y4 {  可以认为你理解的是只对第一个字段的累计,跟GROUP BY grade,rollup(ID)的结果很接近,再看rollup3个字段的情况:
$ F4 W8 n+ R; y( j' ?  SQL> select part,grade,id,num from a;
3 C" u# V6 c7 R- X4 P# ~7 Q  PART GRADE ID NUM
+ n! e/ o, I1 r1 ^/ Z+ L7 Q  ---- ---------- ---------- ----------: h9 U: S& r6 _7 y
  p1 a 1 10 [* Y8 l* B' T+ ?( `" D5 V5 i
  p1 a 2 2
; G4 i1 G  K+ w( X+ {  p1 b 3 3
4 _2 s  v7 i. Z& b0 N: H4 e  p1 b 4 45 z" D' U( b6 n
  p2 c 5 5
4 q9 b& \! g. W1 f: O6 S  p2 d 6 6
+ h3 i$ J% h, ]/ e8 u9 @  6 rows selected# @3 G& ]" I5 p& P
  SQL>
+ r: l5 C% a* e$ w1 X  SQL> SELECT decode(grouping_id(part,grade,ID),7,'总计',part) part,
# w5 a2 W( ]: k" s0 |; |  2 decode(grouping_id(part,grade,ID),3,'小计',7,'总计',grade) grade,
2 @8 U# J. |7 I; N5 y  3 decode(grouping_id(part,grade,ID),1,'小计',3,'小计',7,'总计',ID) ID,, k9 b6 ~; c( n1 s4 C6 t
  4 SUM(num)
6 t7 U6 X1 R! B9 `4 ]" e  5 FROM a GROUP BY ROLLUP(part,grade,ID)
: e8 b; \  c2 Z- f, }  6 /
. S% L% v: C% C" Z: Q  PART GRADE ID SUM(NUM). `$ L3 X- @1 y- q0 u/ r  a& p3 s" M
  ---- ---------- ---------- ----------
) l7 }& h% X7 @# n, a  p1 a 1 1
. Y1 P8 _" O) w! B. g) I( j  p1 a 2 24 x- Y/ D; E6 \( C7 t9 M8 y" i6 c
  p1 a 小计 3
7 ^! E& b' k0 P7 m( ^9 v7 O  p1 b 3 3
9 J4 R' c" Q2 Z( j  p1 b 4 4
. N  `/ k, [5 @8 T0 n7 I  p1 b 小计 7
& `0 Z+ F# S; o7 |6 t7 x4 a! b5 x  p1 小计 小计 10$ c6 Z6 t" C# J( s
  p2 c 5 53 L7 F- _5 M5 W% G5 b& A- c# H
  p2 c 小计 5* c9 [! P% l6 f6 T
  p2 d 6 6
. A0 P# g2 S% S' K- R  p2 d 小计 6" m6 ?& Z& z: p8 P
  p2 小计 小计 11
! j: d- N0 r% t) h5 \0 O  总计 总计 总计 21
# `' Q$ l8 f, e! F5 M! Q+ h$ H' f  13 rows selected( [8 k* j. i  b. x8 F
  这里不光只对第一个字段做了累计,先按(part,grade,ID)分组累计,然后按(part,grade)分组累计,再按(part)分组累计,最后累计全部6 U/ D) Y3 f: P$ t1 O3 c
  再看看rollup 和 cube的区别:6 O, x6 H8 h+ `& `( H6 J
  对于ROLLUP(part,grade,ID),grouping_id(part,grade,ID)的值范围在(0,1,3,7)间即
& @( D* Q2 {( x" h/ K  part,grade,ID(作为合计时计为1)8 d2 S6 ]/ u5 b, W
  0,0,0" I* x' U. M+ h
  0,0,1
9 |$ B3 r3 C7 g  0,1,14 I# O' i# X6 \9 N
  1,1,1
9 }- X) d4 u- ~9 t1 Y  而对于cube(part,grade,ID),grouping_id(part,grade,ID)的值范围在0-7之间即& b) q% l0 M8 M* [: G3 Y* y+ g5 q" t
  part,grade,ID(作为合计时计为1)7 t7 O% G3 C% ~' x; m- g
  0,0,0
# U2 `0 ?- t" {" t2 e$ ?  a  0,0,1
9 q2 H5 u! W, U5 P  0,1,0
3 E7 I, F. g7 g$ C( D1 x2 T  0,1,1
9 B- E* T1 B6 C) z; k$ u  1,0,00 r; k: A) z' p1 J
  1,0,1
( J+ C4 m- w  L) C) p: o: R  1,1,0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-20 12:29 , Processed in 0.230563 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表