在GROUP BY SQL Server之后占总SUM的百分比
技术问答
275 人阅读
|
0 人回复
|
2023-09-14
|
我有这些结果:
1 H: H! x' c. D3 r- a& nPersonID SUM(PA.Total)
Z. F# ?1 _# q- ~' x0 y-------------------------* f2 l) P9 R9 W
1 75+ ` f; i0 |1 W) Z' E! I
2 75
$ q7 j7 G% l; S' Q0 t 3 15
, u0 Y! ~: B$ L8 V: q9 b/ y) K/ N" S 4 15
! W# ~9 G2 z- D 5 60/ v; u! E. T. a+ R! ]1 T
6 60
2 N! l M3 \1 d" ~8 Q) }与表类似:- o( _: [, ^/ S/ ]- L
PersonID Total
$ [6 h/ a: r& A" R' C- @------------------5 B' O7 q% g# p0 y- o
1 50- D+ w D5 E# t& l \
2 50
0 q' \; r1 y" P: j 3 10
8 j8 w& F1 { v% m; a! l5 a N 4 10
+ F% H8 C8 R1 B/ [8 V 5 40' y( j* N) n; d k1 |" g
6 40, T* o$ T s, G
1 25
9 ?" h# P+ G3 K) h0 {; r- G 2 25
8 m# d& G" U+ i) a5 z4 d 3 5% c3 F2 [( l! [
4 5: L# U) o4 A+ S$ E$ S+ o" V6 G4 R
5 20
1 V" k! L: C6 a8 ~- _ 6 20
& S5 ~0 I* X0 S- Y8 ?这些按人分组。现在,我希望添加一列,其中包含根据每个人的总和计算得出的每个人的百分比。
. e$ _3 Q7 F( P& P) Z例如:总和为300,因此我需要这样的结果:- j# Y! O9 R5 l: ^% R) h* k
PersonID SUM(PA.Total) Percentage( x$ p+ i- m7 j" N
--------------------------------------1 p0 ]/ w7 f$ |/ c. e3 V
1 75 25%
3 x" e* ?6 ]3 w Q% T 2 75 25%
% |8 a, [! v8 Q/ d+ Q 3 15 5%4 y$ t7 {( b3 A! L# t. z7 m& e' ~
4 15 5%2 X. _ \8 I( y
5 60 20%
, A3 y6 Y" }# [; O1 q/ ? 6 60 20%1 D6 D4 P; _* }" [5 L& J
我在网上查看了代码,并提出了这样的解决方案:+ S% u8 |9 O6 |, M- x# |: ~
SELECT
, T1 N N8 x/ q4 n P.PersonID, SUM(PA.Total)
3 ^ G( f5 }. r# g SUM(PA.Total) * 100 / [p] AS 'Percentage'
( g h& n- s( v6 G FROM
0 p5 z, Y* ?5 _) a9 Y6 T- C7 x Person P
; m- P4 d$ Z% Y% K3 k: ` JOIN / f# l$ z/ a& P0 }' d( s
Package PA ON P.PersonID = PA.PackageFK" S# [& l& N6 z
CROSS JOIN ) G! c3 I; H! h, s& D+ v0 q
(SELECT SUM(PA.[Total]) AS [p]
6 l5 P# {9 X! {: S FROM Package PA) t2 E% o3 i3 g7 M% i3 s) v; W, I
GROUP BY
! s7 y- d: K& G( k/ ~3 ^$ p) y" m. a P.PersonID, n/ ^. G. Y) P. Y `. a4 D
但是我不确定如何将交叉联接以及已经存在的分组/求和部分合并到联接中。或者这是否完全正确。) U; R* t/ C4 H1 e5 f$ a3 x: i4 @
任何帮助将不胜感激-) a; ?$ p5 W' V, \+ }0 n' V
SQL小提琴http://sqlfiddle.com/#!9/80f91/24 t! _& O$ u( U) N1 r! w
, L7 n3 q8 E+ \; R解决方案: S6 f6 B' ~1 `- i
1 B8 s6 Q% r% {& M N9 x. Z) e S
/ e+ J8 b# P2 a1 X0 G3 x* x1 `) o0 q* u- E% ~
您不需要cross join。只需使用窗口功能:
" C0 R6 m) q4 X ~5 E# |SELECT P.PersonID, SUM(PA.Total),3 c/ H! W' F! R1 {4 d; r8 o# W/ e
SUM(PA.Total) * 100.0 / SUM(SUM(PA.Total)) OVER () AS Percentage
3 k$ B& a/ P# J1 nFROM Person P JOIN
" [. a5 X' ]$ Y9 ~ Package PA
* s* u/ T7 @7 @* K' `/ `- w: K ON P.PersonID = PA.PackageFK
! r$ ]3 o5 p4 N. c1 T3 PGROUP BY P.PersonID;
3 E# K- S% V* g' |( l! G* N {请注意,您不需要JOIN此查询:
4 u: r t3 D2 ^* v2 X; A7 ?SELECT PA.PersonID, SUM(PA.Total),3 ?& E9 `2 z2 t( B! j8 K
SUM(PA.Total) * 100.0 / SUM(SUM(PA.Total)) OVER () AS Percentage
% ` w$ D3 u) T) \! _$ X/ `3 `FROM Package PA+ k3 H1 F; D9 U A/ ]9 i
GROUP BY PA.PersonID;* I% ~1 _' z/ }+ H8 b: s- I o
SQL Server执行整数除法。我使用十进制数字进行此类计算,因此更有意义。
: a/ }0 w/ \! |这是一个SQL Fiddle,有两个更改:
o( i( g7 j G8 m1 w" s[ol]数据库已更改为SQL Server。
/ [' }( Z- ~ @& x1 B% J L, K8 [总数存储为数字而不是字符串。1 P, _0 E: P0 w6 q0 X2 ~- ]
[/ol] |
|
|
|
|
|