SQL Server中varchar转int失败求助:统计不同Type的MachineID数量
问题描述
需要统计数据表中Type为R和Type为C时的MachineID数量,编写的查询语句报错:
Conversion failed when converting the varchar value 'gvpm236b' to data type int.
尝试CONVERT和CAST方法均无效,原查询语句如下:
SELECT COUNT (CASE WHEN Type = 'R' THEN CONVERT(int, MachineID) ELSE 0 END) AS 'Non-Persistant', COUNT (CASE WHEN Type = 'C' THEN CONVERT(int, MachineID) ELSE 0 END) AS 'Persistant' FROM table
示例数据
| MachineID | Type |
|---|---|
| gvpm236b | R |
| 123456 | C |
| 111 | C |
| 123 | R |
期望输出
| Non Persistant | Persistant |
|---|---|
| 2 | 2 |
解决方法
你的问题根源在于:
CASE表达式要求THEN和ELSE返回值的类型必须一致,当Type='R'时,gvpm236b是无法转为int的字符串,直接触发转换错误。- 统计符合条件的记录数,完全不需要转换
MachineID的类型——COUNT只统计非NULL值,只要在满足条件时返回非NULL值,不满足时返回NULL就行。
推荐两种简单有效的写法:
写法一:COUNT配合CASE(利用NULL不被计数的特性)
SELECT COUNT(CASE WHEN Type = 'R' THEN MachineID END) AS 'Non Persistant', COUNT(CASE WHEN Type = 'C' THEN MachineID END) AS 'Persistant' FROM [table]
当条件不满足时,CASE默认返回NULL,COUNT会自动忽略这些NULL值,最终结果就是符合条件的记录数。
写法二:SUM配合CASE(直接累加计数)
SELECT SUM(CASE WHEN Type = 'R' THEN 1 ELSE 0 END) AS 'Non Persistant', SUM(CASE WHEN Type = 'C' THEN 1 ELSE 0 END) AS 'Persistant' FROM [table]
这种写法更直观:满足条件时加1,不满足时加0,SUM的结果就是目标数量,完全避开了类型转换的问题。
内容的提问来源于stack exchange,提问作者ram
相关产品推荐
相关产品推荐

