|
我有一个简单的查询:& U7 a/ d( [3 N3 U9 ^
WITH data(val1, val2, val3) AS
- B$ `1 |* V4 C! W! M ( SELECT 'a' ,'a-details' ,'1' FROM DUAL
/ F w# W& D3 J' a UNION ALL, M' z8 \4 D9 p7 `
SELECT 'b' ,'b-details' ,'2' FROM DUAL
. w; d% h1 u2 k8 n9 V7 W0 S UNION ALL3 f7 A" W3 ?0 s, V9 y* n3 B
SELECT 'c' ,'c-details' ,'3' FROM DUAL7 d0 ~0 P7 N* w, n/ N5 p- p( F- N
)
$ K# E7 c' V! v& _( t. R* USELECT NVL(val1,'Total Result'),0 n% i5 E& Q( |: ?0 O
val2,
; c, G0 z3 S4 K/ l. C2 ]% D3 O# M SUM(val3) tot7 x3 S' v# ?6 r/ O0 [# f1 b
from data
8 @6 J$ H" `7 a. ~group by rollup(val1, val2);
2 e7 G) D: ~3 ]9 d我得到这样的输出:1 v* B$ S7 h0 P7 F
VAL1 VAL2 TOT& Q6 O( T9 v( G, B
-------------------------------- -------------------------------- ----------
- e0 N% ^" Q, X; k# Na a-details 1 0 m* n/ q5 ^4 S" G- q9 i
a 1 0 O* t# v) Q ]
b b-details 2 : V9 e5 F0 y9 H; f- I3 z$ Z" V
b 2
" @( W+ c L8 ?/ `% L/ l, uc c-details 3 5 A$ U3 a( A3 J4 p% j5 A
c 3
2 k4 H- \4 L+ R5 \ T& A( c$ \3 KTotal Result 6" Y# X4 W: V* `8 ~( d
但我需要这样的输出:
8 ?+ I; z" Q. M2 m' g# WVAL1 VAL2 TOT7 i1 o! G2 b# D- ]* b) ~% a; }- _0 {
-------------------------------- -------------------------------- ----------
% s+ O2 U9 y" ~' R K Xa a-details 1
1 L' Y( w( ^+ h8 x; I0 g1 Bb b-details 2
! J. ~' w' J- } I* W. |6 Tc c-details 3
. V8 ~: G- s- I" U+ ?% nTotal Result 6( ^) g; q2 L9 t0 k6 x
提前致谢。
7 v; m- A+ R7 c + i+ w4 W4 @& n: `4 I2 N
解决方案:, q; P& Y" r7 j
+ c, |# l- |, ] m ]3 o! U0 e. N- E8 ?1 k6 [, G: `/ z' K
- z- [- M' q- j" |( V2 L 我发现使用GROUPING SET子句指定所需的确切集合要容易得多:
' S- k b% C8 Y; Y- O; TWITH data(val1, val2, val3) AS& |( S0 I/ O, ^9 F6 L
( SELECT 'a' ,'a-details' ,'1' FROM DUAL
4 y4 r/ G3 [8 q! c- J2 F; d UNION ALL
- G/ L4 [: t1 M1 y3 q* _ SELECT 'b' ,'b-details' ,'2' FROM DUAL/ ~* d; U2 f @; Q" \2 ]) N
UNION ALL& @8 g8 ?$ Z7 I! A2 C
SELECT 'c' ,'c-details' ,'3' FROM DUAL- N3 e) f2 ]3 I* A: Z
)
! w/ @/ f8 g/ f. {( a9 o' Z% _8 j# aSELECT NVL(val1,'Total Result'),1 h( w c, Z6 ^' {
val2,0 p# a: I( y: m% E2 K4 k4 C2 m
SUM(val3) tot6 R0 f" ?9 [+ c- a* x, V; {( X! y
from data
( A0 S0 `0 q6 V- H6 U$ Jgroup by grouping sets ((val1, val2),());2 z, D* A D& H* s- d
我怀疑它会更有效,因为它直接指定要计算的级别。
' A% w* y0 o/ R+ ?- jhttp://sqlfiddle.com/#!4/8301d/30 J, w* K/ F' ^) P6 q# ~
CUBE和ROLLUP对于自动生成大量聚合级别(例如,维度层次结构中的每个级别)非常方便,如果您想从生成的大型CUBE中消除一小部分级别的子集,则可能会使用GROUPING3 ^! j1 k, ^% ` U+ G
ID设置,但是GROUPING SET是专门用于指定特定聚合级别的。 |
|