我试图使用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。
正在发生的事情是,您在列Years
中混合了不同数据类型的文字。(即int 5
和varchar Unknown
将在同一个结果集中)。您需要将这些文字值编码为相同的数据类型。
试试这个:
- 将硬编码的整数强制转换为string/varchar。我使用了
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
答案就在你面前。在一列中只能返回一种数据类型。你的第一个WHEN语句将Unknown(字符串)建立为一个值。随后的语句传递整数值。db引擎说,我得到了一个整数,我需要在其中插入一个字符串,这是不合适的。
选项是添加一个强制转换到所有的数值操作,将它们转换为varchar(n) {p.campbell刚刚提交},或将您的未知值更改为NULL或一个明显无效的哨兵值,如-1。