sql - 不同结果的 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
第三个结果......
解决方案
推荐阅读
- laravel - 如何使用 Laravel domPDF 删除生成按钮
- javascript - 传递给 asp.net mvc JsonResult actionmethod 的 javascript 对象属性始终为空
- python - 查询DB表并转换为DataFrame ok,但是导出时数据被截断
- sqlplus - 如何覆盖数据库 Oracle 12c SQL plus 中的旧 ddl
- go - 如何通过结构字段名称获取 Gmail API 错误代码?
- scala - 使用枚举更新表
- tensorflow - Keras / TensorFlow 批次随机化?
- c++ - 如何制作从 C++ 到 Swift 的回调函数指针?
- javascript - 从字符串标识符中获取 json 字段
- jupyter-notebook - Airflow Dag 文件夹 - 如何忽略笔记本检查点