回答

收藏

带有多个列的oracle汇总功能

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

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

本版积分规则