【问题标题】:Arithmetic overflow error converting nvarchar to data type numeric in case query算术溢出错误将 nvarchar 转换为数据类型 numeric 以防万一查询
【发布时间】:2021-05-18 01:11:39
【问题描述】:

我试图将赢得的报价数量显示为一个时间范围内报价总数的百分比。 例如。我总共有 294 个报价,其中 173 个中标。我正在寻找的结果是 59%。

我有以下查询,但它返回错误:

将 nvarchar 转换为数字数据类型时出现算术溢出错误

SELECT 
    COUNT(dbo.Quotes.qmpQuoteID *
    CASE WHEN dbo.QuoteLines.qmlResolutionReasonID = 'WON' THEN 100
    ELSE 0.0 END) As WonRate
FROM dbo.Quotes
LEFT OUTER JOIN dbo.QuoteLines on dbo.Quotes.qmpQuoteID = dbo.QuoteLines.qmlQuoteID 
LEFT OUTER JOIN dbo.Reasons ON dbo.QuoteLines.qmlResolutionReasonID = dbo.Reasons.xarReasonID
WHERE uqmpDateSent >= DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()) -3,0)
AND uqmpDateSent < DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0)
AND dbo.Quotes.UQMPCANCELLED = 0
AND dbo.QuoteLines.qmlResolutionReasonID != 'PROFO'
AND dbo.QuoteLines.qmlResolutionReasonID != 'SMSRQ'
AND dbo.QuoteLines.qmlResolutionReasonID != 'OPTIO' 
AND dbo.QuoteLines.qmlResolutionReasonID != 'PRICE'
AND dbo.QuoteLines.qmlResolutionReasonID <> ''

【问题讨论】:

  • 错误是不言自明的,您需要检查您的数据并找到转换为数字时的字符串太大。理想情况下,更改您的数据结构,以便将数字数据存储在数字数据类型而不是字符串中 - 因为这将在很长一段时间内继续困扰您。
  • 粗略猜测UQMPCANCELLED 是varchar,比较应该是UQMPCANCELLED = '0'。没有任何进一步的信息,无法提供帮助
  • 我强烈建议您学习如何使用表别名,这将使您的查询更易于阅读。
  • 鉴于使用ID 列来保存字符串,它可以很容易地成为qmpQuoteID,即nvarchar 列,其中包含不可转换的值。
  • WHERE 子句将你所有的LEFT JOINs 变成INNER JOINs。也就是说,您需要提供有关数据的更多信息才能解决此问题。没有显式转换为数字类型,因此您至少需要说明哪些列是字符串,哪些不是。

标签: sql sql-server tsql case


【解决方案1】:

试试

SELECT 

    WonRate = SUM(Q.qmpQuoteID * (CASE WHEN L.qmlResolutionReasonID = <See Note 1> THEN 100 ELSE 0 END))

FROM            dbo.Quotes      Q
    LEFT JOIN   dbo.QuoteLines  L   ON  L.qmpQuoteID    =   Q.qmlQuoteID 
    LEFT JOIN   dbo.Reasons     R   ON  R.xarReasonID   =   L.qmlResolutionReasonID
    
WHERE   uqmpDateSent    >=  DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()) -3,0)
    AND uqmpDateSent    <   DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0)
    AND Q.UQMPCANCELLED = 0
    AND L.qmlResolutionReasonID NOT IN ('PROFO', 'SMSRQ', 'OPTIO', 'PRICE', '')

--Note 1: I think you need to put here the ReasonID value for the Reason Description = 'WON'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多