回答

收藏

按等于特定值的特定列的总和分组行

技术问答 技术问答 195 人阅读 | 0 人回复 | 2023-09-12

无论如何,数据特定值对数据进行分组。例如,表中有一个Amount列,我想按每100个量分组,不需要while循环/光标:
* d1 Y( d. }% D' o  q, b% H3 A% f8 YDueAmount = 100
/ }, g3 F7 z8 j& U  T, C+ W3 p) U
收据表结构:
0 @- ^$ C6 }" }' _( R+ E! j; hReceiptNo   Amount------------------R1           10000R2          10000R3            700R4        50050500505005050505050505050505050          R5            2000000                                   200000输出:(    按100分组收据表。
6 C3 k0 d  V# N7 pDueNo/GroupKey      ReceiptNo   Amount--------------------------------------D                                                                                                                               R1           10000D2                                                                                                                                                                                                                                                                                        R2          10000D3 3                                                                                                                           R3            700D3 3                                                                                                                           R4         300300300300300                           30030030300300300D                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          R4           20020202000                                 2020D                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          R5         80080800            D 55                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     R5          1000D                                                                                                                                                                                                                                                                                                                                                                                                                                      R55                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      ' i" d& Z9 b1 I; }9 A6 x
    解决方案:                                                                5 H8 _# v1 K8 h5 W
                                                                使用定义了 Due边界助手表可以计算运行总量和 Due边界交集:
8 V) C' N3 ]" P5 f& K4 \0 }/ BWith Receipt As ( -- RunningTotalBefore,AmountLow,RunningTotalBefore) As AmountFrom DueInner Join ReceiptWithTotal On NOT (RunningTotalAfter = AmountHigh)请注意:SUM(...) Over (Order By ... Rows Unbounded Preceding)并且IIF(...)仅在SQL8 q1 g# E7 w- F
Server 可用于2012 。可通过子查询SQL Server 2008年同样的操作,虽然效率要低得多:! D$ ?$ }& J* Q) M
With Receipt As ( -- RunningTotalBefore THEN AmountLow ELSE RunningTotalBefore END As AmountFrom DueInner Join ReceiptWithTotal On NOT (RunningTotalAfter = AmountHigh)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则