列ReduceDuties.Confirmed_Time
是:(Nvarchar
类型)
Confirmed_Time
|----------------|
| 5 |
| 3.5 |
| 10 |
| 15 |
| 18 |
我想对数字进行分类。
所需输出:
1-9 => 2
9-19 => 3
我试过了:
select t.range as [score range], count(*) as [number of occurences]
from (
select convert (float , Confirmed_Time) as Taeid,
case when Confirmed_Time >= 1 and Confirmed_Time <= 9 then '0-9'
when Confirmed_Time > 9 and Confirmed_Time <= 19 then '9-19'
end as range
from ReduceDuties) t
group by t.range
但是我收到以下错误:
将nvarchar值“3.5”转换为数据类型int时转换失败。
显然,confirmed_time
是一个字符串。当您与整数进行比较时,它会尝试比较为整数。所以,明确转换:
(case when try_convert(float, Confirmed_Time) >= 1 and
try_convert(float, Confirmed_Time) <= 9
then '0-9'
. . .
我的建议是永远不要依赖隐式转换。它介绍了很难发现错误。
如果您希望此值为十进制(这对我来说比int更有意义),那么您应该更改表中的类型。如果由于某种原因(例如某些值不是数字)不可能,则可以添加新列:
alter table ReduceDuties add confirmed_time_dec as (try_convert(decimal(10, 2), Confirmed_Time));
然后,您可以在查询中安全地使用confirmed_time_dec
。
问题是你没有在CASE
表达式中进行从文本到数字的转换。我可能会从CTE开始,首先进行转换:
WITH cte AS (
SELECT CONVERT(float, Confirmed_Time) AS Confirmed_Time
FROM ReduceDuties
)
SELECT
Confirmed_Time,
CASE WHEN Confirmed_Time BETWEEN 1 AND 9 THEN '0-9'
WHEN Confirmed_Time BETWEEN 9 AND 19 THEN '9-19'
END AS range
FROM cte;
如果你真的打算主要使用确认的时间列作为数字,那么你应该只是使它成为一个数字类型列。然后,如果您不得不偶尔将其用作文本,只需根据需要进行转换。