回答

收藏

更改SUM会将NULL返回零

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

我有一个存储过程,如下所示:* {4 u  E+ H$ o% I
CREATE PROC [dbo].[Incidents]- ?0 _* i. G4 ~
(@SiteName varchar(200))
; @. L8 q  z7 ?' D! n( M! O8 OAS
, \# ~: M# I" J0 oSELECT# E% g3 G' D2 C  e" F0 F3 u
(  $ ]7 y4 L+ t* M: J4 Q# A! z. l' G
    SELECT SUM(i.Logged)  
/ |# L/ {$ x" Z    FROM tbl_Sites s  
( n8 H7 d4 s7 e6 O1 b    INNER JOIN tbl_Incidents i  
! j2 k  x. \, W+ [- {    ON s.Location = i.Location  
- u. u$ M* V8 F6 e$ A    WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)  9 k9 t7 l0 I/ }  B
    GROUP BY s.Sites  
2 k  P; N$ M) ~)  AS LoggedIncidents
2 E/ A# h9 O$ _5 b4 F'tbl_Sites contains a list of reported on sites.
+ b  l* U+ j( d0 F. Z'tbl_Incidents contains a generated list of total incidents by site/date (monthly)
1 B' H) e% B8 W: @'If a site doesn't have any incidents that month it wont be listed.
$ g6 H" m& n4 v3 Q我遇到的问题是,该站点本月没有任何事件,因此当我运行此proc时,我为该站点返回了NULL值,但是我需要返回零/ 0以便在内部使用SSRS中的图表。/ w) o  l2 g! q7 ]) Z
我曾尝试使用合并和isull无济于事。4 ]& E9 D: ~) Y4 r9 B2 V7 F
    SELECT COALESCE(SUM(c.Logged,0))
/ d) j! b' ?% i5 [    SELECT SUM(ISNULL(c.Logged,0))
6 j' {4 E) N2 r9 X. @有没有一种方法可以正确格式化此格式?: g+ l5 a- @' T. F4 s. s$ v1 X
干杯,2 [' ]7 k8 a, T
背风处! w: i# f1 ^  M! j8 M
               
7 G3 V9 c6 S  N6 s' N: |$ {& @解决方案:
  g& U, r% d8 K+ S- ^$ i. Y                * G1 V. m& G# {# z$ N: Z' m

. L& f7 d, }+ H2 Z5 Y
" O( k5 s; C; _: D' Y, k$ f                放在外面:
7 r: D" d* y7 }: i; I5 eSELECT COALESCE(
1 {  G7 G+ q$ L+ _6 }(  
) d0 z; I% p! Z0 ?7 i    SELECT SUM(i.Logged)  . U; d( x  y" [# T& |$ g6 b
    FROM tbl_Sites s  
: g/ m1 k) l" I3 P" m* F+ A    INNER JOIN tbl_Incidents i  ( U, ^: X, V# _6 _2 H
    ON s.Location = i.Locatio餃﹏  ! N* \* s% F: m( W6 z  n+ \
    WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)  
4 o1 l: w- ?6 r0 [    GROUP BY s.Sites  5 v0 P7 I9 H0 t. a% a% P( W
), 0)  AS LoggedIncidents6 b+ q( L* _3 G, F
如果要返回多行,请将INNER JOIN更改为 LEFT JOIN5 j' p4 D, `: S4 R# I
SELECT COALESCE(SUM(i.Logged),0); Z2 \9 n; v' v% w2 j
FROM tbl_Sites s  & w+ K4 S; a( E# f$ Y" t( z. @
LEFT JOIN tbl_Incidents i  . I. [% w4 i, n" g+ v
ON s.Location = i.Locatio餃﹏  
- y' _$ E3 r: {- K* U& ~1 `WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)  5 e. @2 z7 l8 @1 v) }- z
GROUP BY s.Sites
/ ~) H: B3 {% @6 l; q  ^顺便说一句,如果没有保证,请勿在聚合函数中放置任何函数或表达式,例如,不要在ISUM中放置ISNULL,COALESCE,在聚合内部使用函数/表达式削弱性能,查询将通过表扫描执行
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则