我在字段Q1_c
和Q2_c
中收到“将varchar转换为int的错误”。
这些字段是CHAR(1)
,这些字段的值是1,2,3,4,5或U
,但是当有U
时它不会转换,所以我尝试更改U
的值设为0之类的值。我也尝试过CAST(a.q2_c as varchar(1)) = 'U'
-但这也不起作用。我应该使用INT
还是VARCHAR()
?我也尝试使用CONVERT
而不是CAST
。
ALTER VIEW [dbo].[vCDCP_rptInfantImprove]
as
select distinct
IND.tb_cdcp_individuals as Individuals_IndividualID
, A.[tb_cdcp_individuals] as ATQInfant_IndividualID
, A.CreateDate as ATQInfant_CreateDate
, CAST(a.q1_c as varchar(3)) as A_Q1
, CAST(a.q2_c as varchar(3)) as A_Q2
---Infant Sum
, Sum(isnull(cast(a.Q1_c as int),0)) + Sum(isnull(cast(a.Q2_c as int),0)) as InfantSum
---Change U to 0
, case when CAST(a.q1_c as int) = 'U' then 0 else 0 end as Unknown1
, case when CAST(a.q2_c as int) = 'U' then 0 else 0 end as Unknown2
from DBO.tb_cdcp_ATQInfant a
left join DBO.tb_cdcp_individuals ind on a.[tb_cdcp_individuals] = ind.[tb_cdcp_individuals]
where ind.agegroup_c = 'C'
group by IND.tb_cdcp_individuals, A.tb_cdcp_individuals, A.CreateDate
, a.q1_c
, a.q2_c
GO
对我来说,一个简单的想法是定义另一个表...,每个可能的值都带有一个CHAR(1)
,而对应的数字带有一个INT
。然后,只需JOIN
到该表。毫无疑问,如果SQL引擎仅包含5行,它将简单地将整个过程吞入内存。如果有一天需要对更多的值进行编码,则很容易做到这一点。
您可以通过几种不同的方式进行此操作:
由于字段是字符格式,所以将'u'替换为'0',然后将其转换为int:
CAST(Replace(q1_c,'u','0') as int)
或者如果您想创建一个新的计算字段,则可以直接创建一个整数字段:
Case when q1_c='u' then 0 else CAST(q1_c as int) end as q1_c_calc
希望这会有所帮助。