PostgreSQL数字字段溢出错误-精度为10、刻度为1的字段必须舍入为小于10^9的绝对值

PostgreSQL数字字段溢出错误-精度为10、刻度为1的字段必须舍入为小于10^9的绝对值,postgresql,pgadmin,postgresql-12,Postgresql,Pgadmin,Postgresql 12,请注意,我试图找出每行中imls2016.visions和imls2010.visions之和两个值之间的百分比差异。在我在联合声明中添加第三个表(该表为imls_区域)之前,该表工作正常。但每当我运行新代码时,它就会抛出一个数字溢出错误。我已经调整了精度和刻度,但我无法纠正这个错误。请说明我应该在代码中更改什么: (PostgreSQL 12) 错误消息:>“错误:数字字段溢出 详细信息:精度为10、刻度为1的字段必须舍入到小于10^9的绝对值。 SQL状态:22003“ 我的代码: SE

请注意,我试图找出每行中imls2016.visions和imls2010.visions之和两个值之间的百分比差异。在我在联合声明中添加第三个表(该表为imls_区域)之前,该表工作正常。但每当我运行新代码时,它就会抛出一个数字溢出错误。我已经调整了精度和刻度,但我无法纠正这个错误。请说明我应该在代码中更改什么: (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;

当您强制转换为
十进制(10,1)
时,您减少了
总和(imls2016.visions)
的允许值范围,以换取更高的精度,但这会导致结果溢出

您可以做两件事:

  • 计算
    SUM(imls2016.visions)-SUM(imls2010.visions)
  • 降低铸件的精度
  • 实施第一个可能就足够了,您可以将访问中的pct变更定义为:

    ROUND(CAST(SUM(imls2016.visits) - SUM(imls2010.visits) AS decimal(10, 1)) / SUM(imls2010.visits) * 100, 1) AS pct_change_in_visits
    

    好吧,我找到问题了。我的求和值的精度超过10(这意味着当仍然是整数格式时,求和的长度为12个值),因此在强制转换时,它会抛出一个数字字段溢出错误。为了找出哪里出错,我删除了清单1.1中的ROUND()和CAST()函数:

    • 清单1.1:
    这给了我想要查看的访问总数,但暂时忽略了pct_更改(大部分pct_更改为0,因为在sql中除以两个整数会得到一个整数,因此将操作值强制转换为十进制或双精度数字数据类型很重要)

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

    • 清单1.2:

    您能否提供一些有关
    imls2010.访问
    imls2016.访问
    列的其他信息?这些列的类型是什么?您是否有理由将2016年访问量列
    转换为十进制(10,1)
    ,而不是2010年列?imls2016.visions和imls2010.visions是整数数据类型,表示一年中访问图书馆的次数。我之所以使用imls2016.visions,是为了将除法的余数转换为十进制,而不是只返回可被整除的整数的整数。
    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;
    
    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;