SELECT x.Key, x.ID,
MAX(CAST(CASE WHEN x.Display IS NULL THEN 0
WHEN x.Display = 'Class' THEN 0
WHEN x.Display = 'pricing' THEN 0
WHEN x.Display = 1912.995 THEN 1913
ELSE x.Display END as float)) AS GLwritten
FROM x
inner join y on y.rk_pk = x.pk
group by x.Key, x.ID
如果我没有输入WHEN x.Display = 1912.995 THEN 1913,那么我将收到以下错误: 将nvarchar值'1912.995'转换为数据类型int时,转换失败。
x.Display是nvarchar。 不幸的是,我无法控制专栏上的设计。
错误是将nvarchar值'1912.995'转换为数据类型int时转换失败。
答案 0 :(得分:0)
您应该真正避免在同一列中存储混合数据类型。
也就是说,我假设您的x.Display
的其他值可以转换为FLOAT。您需要在CASE语句的每个部分中使用相同的数据类型,然后CAST才能工作。
DECLARE @x TABLE (Display NVARCHAR(MAX));
INSERT @x (Display) VALUES ('Class');
INSERT @x (Display) VALUES ('pricing');
INSERT @x (Display) VALUES ('1912.995');
INSERT @x (Display) VALUES ('123.456');
SELECT
MAX(
CAST(
CASE WHEN x.Display IS NULL THEN '0'
WHEN x.Display = 'Class' THEN '0'
WHEN x.Display = 'pricing' THEN '0'
ELSE x.Display END
AS FLOAT)
) AS GLwritten
FROM @x x
答案 1 :(得分:0)
CASE
表达式的类型是优先级最高的值的类型。在这种情况下,值为0
,0
,0
,1983
和Display
。这些类型为int
,int
,int
,int
和nvarchar
。由于int
的优先级高于nvarchar
,因此CASE
表达式的类型为int
。因此,当您尝试将带小数点的值转换为int
时,它将失败。
请注意,float
的优先级高于int
。因此,如果您可以将值之一设为float
,则整个CASE
表达式的值将为float
。
执行此操作的一种方法是将第一个0
替换为cast(0 as float)
,CASE
的值为float
,并且可以进行字符串转换。
create table x ( Display nvarchar(20) );
insert into x ( Display ) values
( NULL ),
( 'Class' ),
( 'pricing' ),
( '1912.995' ),
( '3.14159265' ),
( '2000' )
SELECT CASE WHEN x.Display IS NULL THEN 0
WHEN x.Display = 'Class' THEN cast ( 0 as float ) -- <<<===
WHEN x.Display = 'pricing' THEN 0
WHEN x.Display = 1912.995 THEN 1913
ELSE x.Display END AS GLwritten
FROM x