2

请我试图找出每行中两个值总和 imls2016.visits 和 imls2010.visits 总和之间的百分比差异。在我在联合声明中添加第三个表(该表是 imls_regions)之前,这之前工作正常。但是每当我运行新代码时,它都会引发数字溢出错误。我已经调整了精度和比例,但我无法纠正这个错误。请问我应该在我的代码中改变什么:(PostgreSQL 12)

  • 错误消息:>“错误:数字字段溢出详细信息:精度为 10、比例为 1 的字段必须舍入为小于 10^9 的绝对值。SQL 状态:22003”

我的代码:

SELECT imlsreg.obereg,
        imlsreg.obereg_name,
        SUM(imls2016.visits) AS total_visits_2016,
        SUM(imls2010.visits) AS total_visits_2010,
        ROUND((CAST(SUM(imls2016.visits) AS decimal(10, 1)) - SUM(imls2010.visits)) / SUM(imls2010.visits) * 100, 1) AS pct_change_in_visits
FROM imls_regions AS imlsreg INNER JOIN imls_library_survey_2016 AS imls2016
ON imlsreg.obereg = imls2016.obereg
INNER JOIN imls_library_survey_2010 AS imls2010
ON imlsreg.obereg = imls2010.obereg
WHERE imls2016.visits >= 0 AND imls2010.visits >= 0
GROUP BY imlsreg.obereg, imlsreg.obereg_name
ORDER BY pct_change_in_visits ASC;
4

2 回答 2

2

当您转换为 时decimal(10,1),您正在减少允许值的范围SUM(imls2016.visits)以换取更高的精度,但这会导致您的结果溢出。

你可以做两件事:

  1. 计算执行强制转换SUM(imls2016.visits) - SUM(imls2010.visits)
  2. 降低铸件的精度。

实现第一个可能就足够了,您可以定义pct_change_in_visits为:

ROUND(CAST(SUM(imls2016.visits) - SUM(imls2010.visits) AS decimal(10, 1)) / SUM(imls2010.visits) * 100, 1) AS pct_change_in_visits
于 2020-03-27T17:45:03.190 回答
0

好的,我发现了问题。我的总和值的精度超过 10(这意味着当仍为整数格式时,总和的长度为 12 个值),因此在转换时会引发数字字段溢出错误。为了找出我哪里出错了,我删除了清单 1.1 中的 ROUND() AND CAST() 函数:

  • 清单 1.1:
SELECT imlsreg.obereg,
        imlsreg.obereg_name,
        SUM(imls2016.visits) AS total_visits_2016,
        SUM(imls2010.visits) AS total_visits_2010,
        (SUM(imls2016.visits) - SUM(imls2010.visits)) / SUM(imls2010.visits) * 100 AS pct_change_in_visits
FROM imls_regions AS imlsreg INNER JOIN imls_library_survey_2016 AS imls2016
ON imlsreg.obereg = imls2016.obereg
INNER JOIN imls_library_survey_2010 AS imls2010
ON imlsreg.obereg = imls2010.obereg
WHERE imls2016.visits >= 0 AND imls2010.visits >= 0
GROUP BY imlsreg.obereg, imlsreg.obereg_name
ORDER BY pct_change_in_visits ASC;

这给了我想要查看的访问总和,但现在忽略 pct_change(大部分 pct_change 为 0,因为在 sql 中将两个整数相除会得到一个整数,因此将操作值转换为小数或双精度数很重要精度数值数据类型)

清单 1.1 结果

在计算了最大访问值的长度(长度为 12)后,我能够找到准确的精度值。然后我恢复到以前的代码并将精度调整为数字 (14, 1)。参见清单 1.2 中的代码:

  • 清单 1.2:
SELECT imlsreg.obereg,
        imlsreg.obereg_name,
        SUM(imls2016.visits) AS total_visits_2016,
        SUM(imls2010.visits) AS total_visits_2010,
        ROUND((CAST(SUM(imls2016.visits) AS decimal(14, 1)) - SUM(imls2010.visits)) / SUM(imls2010.visits) * 100, 2) AS pct_change_in_visits
FROM imls_regions AS imlsreg INNER JOIN imls_library_survey_2016 AS imls2016
ON imlsreg.obereg = imls2016.obereg
INNER JOIN imls_library_survey_2010 AS imls2010
ON imlsreg.obereg = imls2010.obereg
WHERE imls2016.visits >= 0 AND imls2010.visits >= 0
GROUP BY imlsreg.obereg, imlsreg.obereg_name
ORDER BY pct_change_in_visits ASC;

清单 1.2

于 2020-03-27T17:56:59.217 回答