我在一个程序中发现了一些我最初认为不正确的语句,但在测试它们之后,我确信它们工作正常。我无法理解的是方式。
我有一个包含记录id、pts和ptsOf列的简单表:
DECLARE @DataSource TABLE
(
RecordID TINYINT
,Pts INT
,PtsOf INT
)
INSERT INTO @DataSource
VALUES (1,5,5)
,(1,7,8)
,(1,3,5)
,(2,5,0)
我需要的是使用以下公式计算每条记录的总分:
SUM(pts)/SUM(ptsOf) * 100
因此,上面的语句将产生以下错误,因为对于最后一条记录,我将有5/0:
消息 8134,级别 16,状态 1,第 21 行遇到除以零错误。
但是我发现的语句仅在select子句中检查除以零,而在order by子句中没有:
SELECT RecordID
,CAST(CAST(SUM(Pts) AS decimal) / CASE SUM(PtsOf) WHEN 0 THEN NULL ELSE SUM(PtsOf) END * 100 AS decimal(18, 0))
FROM @DataSource
GROUP BY RecordID
ORDER BY RecordID, CAST(CAST(SUM(Pts) AS decimal) / SUM(PtsOf) * 100 AS decimal(18, 0)) ASC
为什么按类别顺序计算不会产生错误?
下面是完整的例子:
SET NOCOUNT ON
GO
DECLARE @DataSource TABLE
(
RecordID TINYINT
,Pts INT
,PtsOf INT
)
INSERT INTO @DataSource
VALUES (1,5,5)
,(1,7,8)
,(1,3,5)
,(2,5,0)
SELECT RecordID
,CAST(CAST(SUM(Pts) AS decimal) / CASE SUM(PtsOf) WHEN 0 THEN NULL ELSE SUM(PtsOf) END * 100 AS decimal(18, 0))
FROM @DataSource
GROUP BY RecordID
ORDER BY RecordID, CAST(CAST(SUM(Pts) AS decimal) / SUM(PtsOf) * 100 AS decimal(18, 0)) ASC
SET NOCOUNT OFF
GO