首页 > 解决方案 > 不同结果的 SQL 计算

问题描述

请参阅下面的更新问题

在我的数据库中,我有一个带有浮点类型列 (Col) 的表。该表具有以下三行/值:

100
97.65625
96.0451301148202

现在我需要计算行的总和除以在视图中使用的行数((100 + 97.65625 + 96.045130114820225) / 3)

Select ...
, ISNULL((SELECT SUM(Col) FROM MyTable), 0) / (SELECT COUNT(Col) FROM MyTable) As CalcResult

在数据库中它给我〜97.16 - 但如果我在计算器或Excel中进行相同的计算它给我〜97.90

在我的数据模型中,我有public double CalcResult { get; set; }

是什么导致了差异?我认为它太大了,不能只关注精度/准确性?

更新:

我发现了为什么我得到了超出预期的其他计算 - 但我不明白为什么。

我有一张参与者表:

Id    TeamId    Name    W1    W2

我创建了一个视图,在其中计算每个参与者的索引(W1 / W2) * 100。像这样:

Id    TeamId    Name    W1    W2    Index
1     1         P1      72    77.25 93.2038835
2     1         P2      69.3  73    94.9315068
3     1         P3      0     0     100
4     2         P4      62.5  64    97.65625
5     3         P5      0     0     100

接下来,我有一个基于另一个表 Teams 的视图,其中我为每个团队从 Participant 视图计算 Index 的总和:

SELECT Id, EventId, Name,
ISNULL((SELECT SUM(Index) FROM ParticipantView WHERE TeamId = Teams.Id), 100) AS TeamIndex,
(SELECT COUNT(Index) FROM ParticipantView WHERE TeamId = Teams.Id) AS ParticipantCount From Teams 

ID = 1 的团队的 TeamIndex288.13539除以 ParticipantCount (3) 96.0451301

ID = 2 的团队的 TeamIndex97.65625除以 ParticipantCount (1) 97.65625

ID = 3 的团队的 TeamIndex100除以 ParticipantCount (1) 100

每个团队都是活动的一部分。我还需要计算整个事件的 Index 总和。在这里,我可以从 TeamView 和 ParticipantView 获得我的结果。

如果我从 ParticipantView 计算,它是:(93.2038835 + 94.9315068 + 100 + 97.65625 + 100) / 5 = 93,15832806

如果我从 TeamView 计算(这只是 ParticipantView 的总和),它是:(96.0451301 + 97.65625 + 100) / 3 = 97,9004600333

为什么我会得到不同的结果?我只是看不到它。正确的数字是多少?

另一个有趣的事情:如果我在 TeamView 中计算 ParticipantView * 100 的 (Sum(W1) / Sum(W2)) 而不是对索引求和,我会为 Id = 1 的团队得到这个:

((72 + 69.3 + 0) / (77.25 + 73 + 0)) * 100 = 94,0432612313

第三个结果......

标签: sqlsql-server

解决方案


推荐阅读