回答

收藏

带有多个列的oracle汇总功能

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

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

本版积分规则