|
我有一个简单的查询:
0 ~1 D9 T7 f; d4 t. e$ |2 _WITH data(val1, val2, val3) AS
$ Q5 o* p+ x+ z' W- ` ( SELECT 'a' ,'a-details' ,'1' FROM DUAL) o5 M2 r0 Z' \2 O) ]7 [
UNION ALL
/ q0 o+ n5 @2 m3 ^7 q5 u SELECT 'b' ,'b-details' ,'2' FROM DUAL# Y, s9 h6 |- F' ?
UNION ALL: M/ H C7 f0 M. f+ ^" [
SELECT 'c' ,'c-details' ,'3' FROM DUAL
0 _5 y, r8 n7 D6 _ )
* B0 s) |! [8 p5 vSELECT NVL(val1,'Total Result'),. {' @) m; W8 D' b
val2,% F$ f% J/ M' z1 \4 {# y
SUM(val3) tot$ L, Y' m, c0 |4 O) t' D, C
from data
( ^8 p2 _5 k) |. B% E" C) R7 Tgroup by rollup(val1, val2);
! N% `- q; q* i6 p, S% ~3 y, f我得到这样的输出:
/ J' ^, ?& ~- oVAL1 VAL2 TOT; C: h( x* m9 s
-------------------------------- -------------------------------- ----------0 b! Z0 e4 c: |. h2 C
a a-details 1 . b/ k4 i( \9 m. Q; C
a 1 ! g% Y/ Z/ ?* v7 w; n) Y
b b-details 2 - W* l9 \" T" M1 C4 c/ a! L$ s
b 2 ' ~' m( M- C' ]8 d$ H7 X" o- _
c c-details 3
; e5 s- Z3 J9 ?; K6 Mc 3
, s+ V1 u0 I0 KTotal Result 6/ `; v( R7 s# I
但我需要这样的输出:) } J: w, v1 b' V8 r+ g( A
VAL1 VAL2 TOT
: r0 l8 M d5 N-------------------------------- -------------------------------- ----------
) W- k G& R8 g. K5 Z6 X8 ?a a-details 1
! I" l5 m1 j% Yb b-details 2 & W4 m: i1 b& ?5 c. q' m' Z
c c-details 3 3 O& l$ x4 }6 J, g/ E
Total Result 6( S1 } ]% _8 @
提前致谢。$ B& _0 ]- A- r/ A6 Y! B
; d8 _6 f9 f, T, {- X
解决方案:
' Q6 q. Q5 w5 P/ ^, g$ e ( h0 E7 c6 \: i
1 O+ Q- }" Q3 d# A7 e, o
: V, Y) P. r) o3 D
我发现使用GROUPING SET子句指定所需的确切集合要容易得多:' O8 k1 z7 H- X$ |4 `3 h
WITH data(val1, val2, val3) AS8 B- T) P% L( z5 o. V% i
( SELECT 'a' ,'a-details' ,'1' FROM DUAL& s4 U6 i4 a& I% l7 g4 I l
UNION ALL
! E# c( i/ m3 b SELECT 'b' ,'b-details' ,'2' FROM DUAL
8 D9 }/ [5 ]: D U# r7 f UNION ALL
4 M% |- ` Q% A4 N5 ~2 r5 h7 w SELECT 'c' ,'c-details' ,'3' FROM DUAL7 K/ Y- j+ m; X$ J3 u
)
. k( c$ Q5 K5 f- p' k. q/ iSELECT NVL(val1,'Total Result'),
! Q/ E7 D @2 N. @ val2,: p# E; O" `8 p% I7 K
SUM(val3) tot
5 @+ |5 D8 {) v$ S3 `9 tfrom data
+ w3 e# G" u6 d8 O/ z/ Q% vgroup by grouping sets ((val1, val2),());$ y1 A3 V8 b v4 F/ [# ?3 n, X' L
我怀疑它会更有效,因为它直接指定要计算的级别。
3 O% D6 ?7 [6 Y3 U0 D9 W5 R* Q4 g0 Mhttp://sqlfiddle.com/#!4/8301d/39 E/ v1 ^; Z* l% Y, U3 f
CUBE和ROLLUP对于自动生成大量聚合级别(例如,维度层次结构中的每个级别)非常方便,如果您想从生成的大型CUBE中消除一小部分级别的子集,则可能会使用GROUPING
% B$ Z) O G+ Q5 W$ z$ B) @6 l+ yID设置,但是GROUPING SET是专门用于指定特定聚合级别的。 |
|