首页 > 解决方案 > SQL中单列中的bin

问题描述

餐桌工人

worker_id Salary 
    1  100000
    2  80000
    3  300000
    4  500000
    5  500000
    6  200000
    7  75000
    8  90000

我希望创建另一个列salary_bin,如果薪水 < 80k,那么它应该是 bin 1,如果薪水在 80k 和 100k 之间,那么它将在 bin 2 中,如果薪水在 100k 和 300k 之间,那么它将是 bin3,如果工资在 300k 和 500k 之间,那么它将是 bin 4。

试图:

alter table dbo.worker 
add salary_bin decimal(10,2) 
select worker_id, salary, 
case when salary>=0 and salary<80000 then salary_bin ='1',
case when salary>=80000 and salary<=100000 then salary_bin ='2',
case when salary>=100000 and salary<=300000 then salary_bin ='3',
case when salary>=300000 and salary<=500000 then salary_bin ='4
from Worker

错误:

'=' 附近的语法不正确。

有人可以帮忙吗?

标签: sqlsql-servertsql

解决方案


修复您的case表达式以使用正确的语法并删除表引用,因为计算列会自动引用您将其添加到的表,并且实际上不能引用另一个表(除非您使用缩放函数)。

此外,要制作垃圾箱,您应该确保值之间没有重叠,即您不能有一个垃圾箱 <= 100,000,然后下一个垃圾箱 >= 100,000,因为它会落在第一个垃圾箱中,而您想要第二个垃圾箱。你需要表达的一侧是>=,而另一侧是公正的<。而且您通常希望 anelse处理任何更高的值,例如 bin 5。

alter table dbo.worker 
add salary_bin as
case when salary >= 0 and salary < 80000 then 1
when salary >= 80000 and salary < 100000 then 2
when salary >= 100000 and salary < 300000 then 3
when salary >= 300000 and salary < 500000 then 4
else 5
end

注意:您不引用数值。

此外,由于case表达式在第一个匹配项处停止,您可以通过将条件的顺序颠倒为从最大到最小的顺序来简化,然后删除下限检查,如下所示:

alter table dbo.worker 
add salary_bin as
case when salary >= 300000 then 4
when salary >= 100000 then 3
when salary >= 80000 then 2
else 1
end

注意:这不处理高于 500,000 的 bin,因为未指定,但可以轻松扩展以这样做。

进一步:在指定 bins/buckets 时,表达式“between”不够精确,因为它没有指定开始值和结束值是包含在范围内还是排除在范围内。应始终使用“大于”、“大于等于”、“小于”、“小于等于”来完全清楚 bin 包含哪些值。


推荐阅读