ある手順で、最初は間違っていると思っていたいくつかのステートメントを見つけましたが、それらをテストした後、それらが正常に機能していることを確信しました。私が理解できないのは方法です。
record 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