【问题标题】:SQL Server Conversion TypesSQL Server 转换类型
【发布时间】:2017-03-03 17:07:00
【问题描述】:

我在 SQL Server 中有以下 SELECT:

SELECT  
    th.CidadeCod,
    th.ContratoCod,
    CONVERT(DECIMAL(5,2), ( SUM(th.PlacasLidas)/SUM(th.Trafego) ) * 100) AS [IndiceOCR]
FROM 
    controle.TrafegoFaixaHora th 
INNER JOIN ssis.Contratos c ON th.ContratoCod = c.ContratoCod AND th.CidadeCod = c.CidadeCod
INNER JOIN controle.Equipamentos e ON th.ContratoCod = e.ContratoCod AND th.CidadeCod = e.CidadeCod
WHERE 
    c.FlagAtivo = 1 AND e.FlagOcr = 1
GROUP BY 
    th.CidadeCod,
    th.ContratoCod

但是返回错误:

消息 8115,第 16 级,状态 2,第 2 行 将表达式转换为数据类型 int 的算术溢出错误。

我该怎么办?

【问题讨论】:

  • th.PlacasLidasth.Trafego的数据类型是什么?
  • 如果去掉 CONVERT 语句,返回什么值?我认为您转换的小数点的大小可能对于您的结果来说太小了?
  • 打破此列,“CONVERT(DECIMAL(5,2), (SUM(th.PlacasLidas)/SUM(th.Trafego)) * 100)”并尝试显示错误的操作.中断和调试...
  • 由于错误是关于转换为 int 我怀疑 PlacesLidas 和 Trafego 都是 int 类型。所以你有2个问题。第一个问题是您的计算结果将是一个 int,其小数部分为(不四舍五入!),第二个问题是它不适合您 decimal(5,2)

标签: sql sql-server type-conversion


【解决方案1】:

试试这个

SELECT  
    th.CidadeCod,
    th.ContratoCod,
    ( SUM(CONVERT(DECIMAL(18,2),th.PlacasLidas))/SUM(th.Trafego) ) * 100 AS [IndiceOCR]
FROM 
    controle.TrafegoFaixaHora th 
INNER JOIN ssis.Contratos c ON th.ContratoCod = c.ContratoCod AND th.CidadeCod = c.CidadeCod
INNER JOIN controle.Equipamentos e ON th.ContratoCod = e.ContratoCod AND th.CidadeCod = e.CidadeCod
WHERE 
    c.FlagAtivo = 1 AND e.FlagOcr = 1
GROUP BY 
    th.CidadeCod,
    th.ContratoCod

出现此错误是因为您的号码大于五位数。

我相信,当您将两个 int 相除时,您需要在操作前转换一个。

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 2014-10-10
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2019-06-03
    相关资源
    最近更新 更多