我正在尝试使用CASE
使用以下内容对包含字符和NULL
以及空白条目的表内容进行分组:
SELECT COUNT(*) AS Clients,
CASE WHEN t.Diagnosedin = 'Unknown' OR t.Diagnosedin ='' THEN 'Unknown'
ELSE CASE WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) =1 THEN 1
ELSE CASE WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) <=2 THEN 2
ELSE CASE WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) <=5 THEN 5
ELSE CASE WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) <=10 THEN 10
ELSE CASE WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5))>=10 THEN '+10 '
END
END
END
END
END
END AS Years
我收到以下错误:Conversion failed when converting the varchar value 'Unknown' to data type int.
,我正在使用MS SQL 2008。
提前谢谢。
答案 0 :(得分:3)
发生的事情是你在Years
列中混合了不同数据类型的文字。 (即int 5
和varchar Unknown
将在同一结果集中)。您需要将这些文字值编码为相同的数据类型。
试试这个:
STR()
函数,并使用LRTIM()
来确保不保留前导空格。CASE
SELECT COUNT(*) AS Clients,
CASE WHEN t.Diagnosedin = 'Unknown' OR t.Diagnosedin ='' THEN 'Unknown'
WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) =1 THEN LTRIM(STR(1))
WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) <=2 THEN LTRIM(STR(2))
WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) <=5 THEN LTRIM(STR(5))
WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5)) <=10 THEN LTRIM(STR(10))
WHEN CAST((CAST(DATENAME(Year,GETDATE()) AS INT)- t.Diagnosedin)AS varchar(5))>=10 THEN '+10 '
END AS Years
答案 1 :(得分:1)
答案就在你面前。您只能在列中返回一种数据类型。您的第一个WHEN语句将Unknown(字符串)设置为值。后续语句提供整数值。 db引擎说我有一个整数,我需要在其中粘贴一个字符串,这将不适合。
选项是为所有数值操作添加一个强制转换,以将它们转换为varchar(n){作为p.campbell刚提交}或将您的未知值更改为类似NULL或明显无效的标记值(如-1)