回答

收藏

带有多个列的oracle汇总功能

技术问答 技术问答 259 人阅读 | 0 人回复 | 2023-09-14

我有一个简单的查询:
  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是专门用于指定特定聚合级别的。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则