|
我有一个简单的查询:
I* G3 H& ~1 [7 ?( x( q1 Z/ GWITH data(val1, val2, val3) AS5 O) c3 `1 ?5 k y% n6 x! M J
( SELECT 'a' ,'a-details' ,'1' FROM DUAL
2 k }; U& [3 i# @9 M @' f UNION ALL1 _ j9 r8 a# h) ^% g
SELECT 'b' ,'b-details' ,'2' FROM DUAL
. M- K8 i/ D4 E UNION ALL& n9 I; ^- E# z3 t' Y( R
SELECT 'c' ,'c-details' ,'3' FROM DUAL
7 N3 a' D6 k2 G1 g* o7 l4 T6 H, f )
' ^- y" n7 W# s9 e* c3 i' ]* \SELECT NVL(val1,'Total Result'),
, p, R! w9 u4 @$ A( k7 ?& | val2,
: x! G4 k/ S' R: [: C SUM(val3) tot; `/ d' i: c3 M5 k! G
from data9 K' d/ ?3 g6 t" @+ Y; h5 x/ P
group by rollup(val1, val2);! @& Y. e' n$ N% F% X
我得到这样的输出:
% ^( f& b5 G4 o( I9 qVAL1 VAL2 TOT
8 H2 T8 W3 g% y; L( ]1 E4 a-------------------------------- -------------------------------- ----------
3 J5 _! P6 r/ x, |a a-details 1
4 _% J6 O( ]6 wa 1 1 r$ N o1 m% |% \8 R
b b-details 2 8 J% L8 Y4 z8 ~' o
b 2 1 a# W6 T" n. c: X) }: K' J. p5 n
c c-details 3 * { g' _; _2 }1 c4 T* W
c 3 8 [5 J2 x) v9 p
Total Result 6 [/ {# a8 f6 o# \
但我需要这样的输出:5 ]5 C8 f" l- f& l& \
VAL1 VAL2 TOT- F; n& n, D& ~& ~. N1 L
-------------------------------- -------------------------------- ----------
7 W9 D, Q- w/ V' ca a-details 1 o( }* g8 e3 U: o3 J% p
b b-details 2 # S m3 z6 O8 H
c c-details 3
+ [$ F* b- O6 v$ b* |4 _* N4 RTotal Result 62 ?1 ^+ y( e y0 {! m2 E8 O& ]
提前致谢。
( Z3 `& @* R; p* q8 c g5 D& ?) i; X3 n: V Y) y L
解决方案:
: D) |8 b7 i; @: z: q N" U5 T ; h5 }8 W. x y) U7 e
- N; D. e: V: } z
) \ K5 E, l3 p# k0 e- \" P- q 我发现使用GROUPING SET子句指定所需的确切集合要容易得多:
4 _. X6 L4 l2 V7 @+ ZWITH data(val1, val2, val3) AS
0 x6 D6 P; { ~) Q/ [ ( SELECT 'a' ,'a-details' ,'1' FROM DUAL0 c$ m( O% T+ x( q8 D1 E. a4 |" a
UNION ALL
4 S5 \4 ]# h+ J' t0 w0 q; ^ SELECT 'b' ,'b-details' ,'2' FROM DUAL
2 R. e+ s! c: z; o `4 K UNION ALL
3 {7 f" f; L m0 x4 u# m SELECT 'c' ,'c-details' ,'3' FROM DUAL
2 E" U0 _7 ^, |1 n2 U& g5 O )
8 [. P: @1 J; PSELECT NVL(val1,'Total Result'),
& k6 u" Y1 k# F, E6 j, u val2,
8 p0 X3 i2 M) w, [& h SUM(val3) tot
# D: r9 F+ X; a1 afrom data* L+ e+ t# n# ]0 P- ^$ t
group by grouping sets ((val1, val2),());- o* f+ O2 B8 {6 I: D
我怀疑它会更有效,因为它直接指定要计算的级别。
6 M n2 z) r5 K7 B" Ihttp://sqlfiddle.com/#!4/8301d/34 H9 b* M- R0 i1 f. D( q; ^
CUBE和ROLLUP对于自动生成大量聚合级别(例如,维度层次结构中的每个级别)非常方便,如果您想从生成的大型CUBE中消除一小部分级别的子集,则可能会使用GROUPING
3 O; V3 N/ N( ^9 kID设置,但是GROUPING SET是专门用于指定特定聚合级别的。 |
|