Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql “如何调试”;将varchar值X转换为数据类型int";时转换失败;?_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql “如何调试”;将varchar值X转换为数据类型int";时转换失败;?

Sql “如何调试”;将varchar值X转换为数据类型int";时转换失败;?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我得到了这个错误 将varchar值“10/2/2017”转换为数据类型int时,转换失败 我不知道如何克服这个问题?这是我正在使用的代码。我知道when语句有问题,但不知道如何转换 SELECT DISTINCT Customers.EmailAddress, COUNT(Orders.OrderID) as NumOrders, CASE WHEN Customers.Custom_Field_Custom2 BETWEEN 1000 AND 499

我得到了这个错误

将varchar值“10/2/2017”转换为数据类型int时,转换失败

我不知道如何克服这个问题?这是我正在使用的代码。我知道when语句有问题,但不知道如何转换

SELECT DISTINCT 
    Customers.EmailAddress,
    COUNT(Orders.OrderID) as NumOrders,
    CASE 
       WHEN Customers.Custom_Field_Custom2 BETWEEN 1000 AND 499999 
          THEN '$1000-$499,999'
    END AS REV
FROM 
    Customers, Orders
WHERE  
    Customers.CustomerID = Orders.CustomerID 
    AND Orders.OrderStatus NOT IN ('Cancelled', 'Payment Declined')
    AND Orders.OrderDate BETWEEN '05/01/2016 00:00' AND '4/30/2017 23:59'
GROUP BY 
    Customers.EmailAddress, Customers.Custom_Field_Custom2

首先,让我们去掉
DISTINCT
,因为
groupby
处理这个问题,然后将连接更改为显式并添加别名。隐式语法被贬低,别名简化了事情:

SELECT C.EmailAddress,
       COUNT(O.OrderID) as NumOrders,
       CASE WHEN C.Custom_Field_Custom2 BETWEEN 1000 AND 499999  
            THEN '$1000-$499,999'
       END AS REV
FROM Customers C
JOIN Orders O on O.CustomerId = C.CustomerID
WHERE O.OrderStatus NOT IN ('Cancelled','Payment Declined')
AND O.OrderDate BETWEEN '05/01/2016 00:00' AND '4/30/2017 23:59'
GROUP BY C.EmailAddress, C.Custom_Field_Custom2
然后,要仅查看
C.Custom\u Field\u Custom2
中的数字数据,请使用
ISNUMERIC(C.Custom\u Field\u Custom2)=1

SELECT C.EmailAddress,
       COUNT(O.OrderID) as NumOrders,
       CASE WHEN C.Custom_Field_Custom2 BETWEEN 1000 AND 499999  
            THEN '$1000-$499,999'
       END AS REV
FROM Customers C
JOIN Orders O on O.CustomerId = C.CustomerID
WHERE ISNUMERIC(C.Custom_Field_Custom2) = 1
AND O.OrderStatus NOT IN ('Cancelled','Payment Declined')
AND O.OrderDate BETWEEN '05/01/2016 00:00' AND '4/30/2017 23:59'
GROUP BY C.EmailAddress, C.Custom_Field_Custom2

您也可以考虑将<代码> E/<代码>添加到您的代码> CASE < /代码>语句中,如果您希望在100-499 99范围之外的东西返回,作为除<代码> > NUL/<代码> < /P> > P>有可能在您的<代码>客户机中有一个日期吗? 已编辑 刚才看到你问题下面的一些评论

由于该列中有不同的数据类型,因此在尝试比较之前,需要过滤掉不需要的数据。下面,我将Customers表移动到一个子查询中,这样我们就可以删除所有带有字母字符或“/”的日期。如果您还需要筛选任何其他时髦的内容,请将其添加到子查询中

    SELECT DISTINCT 
    C.EmailAddress,
    COUNT(O.OrderID) as NumOrders,
    CASE 
       WHEN C.Custom_Field_Custom2 BETWEEN 1000 AND 499999 
          THEN '$1000-$499,999'
    END AS REV
FROM 
    (SELECT * FROM Customers WHERE Custom_Field_Custom2 LIKE '%[0-9]%'
    AND CHARINDEX('/', Custom_Field_Custom2) = 0
    ) C INNER JOIN Orders O ON O.CustomerID = C.CustomerID
WHERE  
    C.CustomerID = O.CustomerID 
    AND O.OrderStatus NOT IN ('Cancelled', 'Payment Declined')
    AND O.OrderDate BETWEEN '05/01/2016 00:00' AND '4/30/2017 23:59'
GROUP BY 
    C.EmailAddress, C.Custom_Field_Custom2

您真诚地期望
10/2/2017
表示为
INT
的外观是什么…?看看您的
客户。自定义字段\u自定义2
列数据-您可能会因为该字段中的数据而收到此错误。旁注,您不需要使用
GROUP BY
进行
DISTINCT
,这是多余的。我在结果中有日期字段。我希望代码排除这些日期字段,并在有数值的地方为其分配一个桶。“这有意义吗?”亚伦·迪茨谢谢你让我知道。我会把它去掉的。非常感谢。它奏效了。。你能再澄清我一个疑问吗?我们为什么不使用cast或convert呢?@c_174当然可以。我们没有使用cast或convert,因为
Custom\u Field\u Custom2
中的数据无法转换为数字(根据您的示例数据:“5/7/2016”“中高”“5/26/2016”-无法将斜杠或字母转换为数字)。您在评论中说,您只希望对数值数据进行比较,因此我们通过将
ISNUMERIC()
添加到where子句来确保只查看数值数据。明白了..谢谢:)