【发布时间】: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