无法在 SQL Server 中将 varchar 转换为 int。

huangapple go评论48阅读模式
英文:

Unable to convert varchar to int in SQL Server

问题

我有一个表格,其中包含如下数据。

我的要求是需要计算type=R和type=C时machineid的数量。

所以我创建了以下查询,但是我遇到了一个错误:

在将varchar值'gvpm236b'转换为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

期望的输出:

非持久 持久
2 2

有人可以帮忙解决这个问题吗?

英文:

I have a table where I am having data like below.

My requirement is I need to calculate count of machineid when type=R and also when type=C.

So I created a query as shown later on, but I'm getting an error

> Conversion failed when converting the varchar value 'gvpm236b' to data type int.

I tried many ways like convert and cast but not working

This is my query :

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

Sample data :

MachineID Type
gvpm236b R
123456 C
111 C
123 R

Expected output:

Non Persistant Persistant
2 2

Could any one please help how to fix this issue?

答案1

得分: 1

这对我来说没问题:

select count(distinct case when Type='R' then machineid END) AS r
, count(distinct case when Type='C' then machineid END) AS c
from (
    VALUES	(N'MachineID', N'Type')
    ,	(N'gvpm236b', N'R')
    ,	(N'gvpm236b', N'R')
    ,	(N'123456', N'C')
    ,	(N'111', N'C')
    ,	(N'111', N'C')
    ,	(N'123', N'R')
) t (machineid, type)
英文:

This works fine for me:

select count(distinct case when Type='R' then machineid END) AS r
,	count(distinct case when Type='C' then machineid END) AS c
from (
	VALUES	(N'MachineID', N'Type')
	,	(N'gvpm236b', N'R')
	,	(N'gvpm236b', N'R')
	,	(N'123456', N'C')
	,	(N'111', N'C')
	,	(N'111', N'C')
	,	(N'123', N'R')
) t (machineid,type)

I added some dups just to test

答案2

得分: 0

由于您正在计算总数,因此无需将 MachineID 转换为整数:

SELECT
 COUNT (case when Type='R' then MachineID  end) as 'Non-Persistant',
 COUNT (case when Type='C' then MachineID  end) as 'Persistant' 
FROM table

或者使用函数 sum()

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

如果只想计算不同的机器数量:

SELECT
  COUNT (Distinct case when Type='R' then MachineID  end) as 'Non-Persistant',
  COUNT (Distinct case when Type='C' then MachineID  end) as 'Persistant' 
FROM table
英文:

Since you are counting totals, there is no need to convert MachineID to int:

SELECT
 COUNT (case when Type='R' then MachineID  end) as 'Non-Persistant',
 COUNT (case when Type='C' then MachineID  end) as 'Persistant' 
FROM table

Or using the function sum() :

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

To count distinct machines only then :

SELECT
  COUNT (Distinct case when Type='R' then MachineID  end) as 'Non-Persistant',
  COUNT (Distinct case when Type='C' then MachineID  end) as 'Persistant' 
FROM table

答案3

得分: 0

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 ddddd

distinct Count

select count(distinct Non_Persistant),count(distinct Persistant)
from (
		SELECT
		  (case when Type='R' then MachineID  end) as 'Non-Persistant',
		  (case when Type='C' then MachineID  end) as 'Persistant' 
		FROM ddddd
)s

Example Data:

create table ddddd(MachineID varchar(100), Type varchar(100))
insert into ddddd
values ('123456', 'C'),
('111', 'C'),
('123', 'R'),
('gvpm236b', 'R')
英文:
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 ddddd

distinct Count

select count(distinct Non_Persistant),count(distinct Persistant)
from (
		SELECT
		  (case when Type='R' then MachineID  end) as 'Non_Persistant',
		  (case when Type='C' then MachineID  end) as 'Persistant' 
		FROM ddddd
)s

Example Data:

create table ddddd(MachineID varchar(100),	Type varchar(100)
)
insert into ddddd
values ('123456'	,'C')
,('111'	,'C')
,('123'	,'R')
,('gvpm236b'	,'R')

huangapple
  • 本文由 发表于 2023年5月22日 22:59:38
  • 转载请务必保留本文链接:https://go.coder-hub.com/76307470.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定