回答

收藏

更改SUM会将NULL返回零

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

我有一个存储过程,如下所示:
$ |, c  `( P" U  u3 Y9 \CREATE PROC [dbo].[Incidents]
7 g. ]9 y- `: e( O! I(@SiteName varchar(200))
3 t) ~. w( `, Q1 ^$ bAS
4 T% F+ K6 S0 P% [7 a/ m$ z5 ZSELECT
" a/ \5 R3 p5 N0 \+ }7 x(  
) d0 W" V! o; ~    SELECT SUM(i.Logged)  9 }% r% K- }/ h) u6 G3 i( I
    FROM tbl_Sites s  9 ]. F3 j) K. I: T4 M
    INNER JOIN tbl_Incidents i  
5 e9 @( N# j+ a0 D' F  F    ON s.Location = i.Location  
* T0 \7 F, ~! J$ Z' q% Y2 X    WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)  
. c3 T5 A  _& D0 o$ ^  T2 |/ I    GROUP BY s.Sites  
6 Y* K( W" G3 Q5 w" |0 }+ _)  AS LoggedIncidents
+ F/ f6 x  U* u% R% w' q'tbl_Sites contains a list of reported on sites.
7 \& Y& Y( S( m, K% v0 {'tbl_Incidents contains a generated list of total incidents by site/date (monthly)8 c- h7 P$ V8 N, k
'If a site doesn't have any incidents that month it wont be listed.) n1 N( Z: {8 S' c7 `' P
我遇到的问题是,该站点本月没有任何事件,因此当我运行此proc时,我为该站点返回了NULL值,但是我需要返回零/ 0以便在内部使用SSRS中的图表。
" u' X; N9 [! T我曾尝试使用合并和isull无济于事。. c3 N+ N( n1 j9 A6 r' p8 f& u1 ]
    SELECT COALESCE(SUM(c.Logged,0))
+ y' P" s8 z" B7 {    SELECT SUM(ISNULL(c.Logged,0)); c+ p: W$ D, h! X+ v8 D
有没有一种方法可以正确格式化此格式?8 ]7 [5 J/ O6 r$ w! ~* T* V
干杯,; r8 K  m" ]- c' [
背风处
) H, L. i; Q, `. [# t               
+ \& R* I: R5 I' |解决方案:7 ]5 i8 D7 t9 o* f0 o' c8 a7 M
               
' h: }; q& p7 U, u/ e& U
9 _9 V. b1 Y( I- s2 u5 n7 K
' l+ X7 ?0 w+ D" Q                放在外面:
- _$ d9 p0 d, R& P6 wSELECT COALESCE(& z1 g% Y5 N1 V+ N* S
(  0 z) l3 S4 d' v! U- d7 d7 q1 _
    SELECT SUM(i.Logged)  
# z: W  W9 @+ f( S7 Q" M) u    FROM tbl_Sites s  6 K1 h& i+ c  T7 Y9 w+ F7 S
    INNER JOIN tbl_Incidents i  # ?0 d8 N, `1 o& L4 f
    ON s.Location = i.Locatio餃﹏  3 v! ^3 c( F" W
    WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)  
$ A" X. h6 ^- \4 B  k    GROUP BY s.Sites  
( j& z, P6 i, ?" E), 0)  AS LoggedIncidents1 y( B1 i. l  O
如果要返回多行,请将INNER JOIN更改为 LEFT JOIN
0 z; a3 c2 c+ f' jSELECT COALESCE(SUM(i.Logged),0)! r4 J# W; q( q) i
FROM tbl_Sites s  
- `7 V. y1 x4 p1 PLEFT JOIN tbl_Incidents i  + j3 @5 \9 ~8 `) q: K6 @& u
ON s.Location = i.Locatio餃﹏  
$ Q2 J/ T! `3 b2 R) l8 i+ tWHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)  
2 F% p  _! G& ?+ x0 G' k! }" zGROUP BY s.Sites6 [2 M! R6 V; I) T4 t7 S" u; y
顺便说一句,如果没有保证,请勿在聚合函数中放置任何函数或表达式,例如,不要在ISUM中放置ISNULL,COALESCE,在聚合内部使用函数/表达式削弱性能,查询将通过表扫描执行
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则