Sql CASE语句中的大量WHEN条件(binning)

Sql CASE语句中的大量WHEN条件(binning),sql,sql-server,sql-server-2008,tsql,case,Sql,Sql Server,Sql Server 2008,Tsql,Case,如果我需要大约100个存储箱,如何在SQL Server 2008中进行存储箱?我需要根据装箱变量是否属于100个相等间隔中的一个,对记录进行分组。 例如,如果存在连续的可变年龄,我可以写: CASE WHEN AGE >= 0 AND AGE < 1 THEN '1' WHEN AGE >= 1 AND AGE < 2 THEN '2' ... WHEN AGE >= 99 AND AGE < 100 THEN '100' END [

如果我需要大约100个存储箱,如何在SQL Server 2008中进行存储箱?我需要根据装箱变量是否属于100个相等间隔中的一个,对记录进行分组。 例如,如果存在连续的可变年龄,我可以写:

CASE
   WHEN AGE >= 0 AND AGE < 1 THEN '1'
   WHEN AGE >= 1 AND AGE < 2 THEN '2'
   ...
   WHEN AGE >= 99 AND AGE < 100 THEN '100'
END [age_group]

但是这个过程会很耗时吗?还有其他方法吗?我想是数学吧。在这种情况下,

Ceiling(Age) AS [age_group]

根据需要将其转换为您选择的角色类型。天花板是SQL Server中的“向上取整”函数。

您可以使用算术实现此目的。大概是这样的:

select floor(bins * (age - minage) / (range + 1)), count(*)
from t cross join
     (select min(age) as minage, max(age) as maxage,
             1.0*(max(age) - min(age)) as range, 100 as bins
      from t
     ) m
group by floor(bins * (age - minage) / (range + 1))
但是,对于您的示例来说,这太过分了,根本不需要案例。

请尝试一下以下代码:

SELECT CASE
         WHEN AGE = 0 THEN 1
         ELSE Ceiling([age])
       END [age_group]
FROM   @T 
此处,上限函数返回大于或等于指定数值表达式的最小整数。例如,select CEILING0.1 SQL返回1作为输出

但根据您的输出要求,地板面积+1足以获得所需的输出

SELECT Floor([age]) + 1 [age_group]
    FROM   @T 

此处,Floor函数返回小于或等于指定数值表达式的最大整数。

如果组的间隔是固定的,例如1200,则只需进行整数除法即可获得该组的索引

例如:

选择1000/1200等于0 选择2200/1200等于1 请记住-如果使用的是decimal数据类型,则需要强制转换为int以获得结果。整数除法要求运算符两边都有int


然后添加1以获得组

根据您对1200段的评论尝试以下操作:

;With Number
AS
(
    SELECT * 
    FROM (Values(1),(2), (3), (4), (5), (6), (7), (8), (9), (10))N(x)
),
Segments
As
( 
    SELECT (ROW_NUMBER() OVER(ORDER BY Num1.x) -1) * 1200 As StartNum,
           ROW_NUMBER() OVER(ORDER BY Num1.x)  * 1200 As EndNum 
    FROM Number Num1
    CROSS APPLY Number Num2
)
SELECT *
FROM Segments
    SELECT *
    FROM Segments
    INNER JOIN MyTable
       ON MyTable.Price >= StartNum AND MyTable.Price < EndNum

从你的例子来看,你似乎并不需要这个案例,因为0岁返回1,1岁返回2,依此类推?因此,似乎age_组只是age+1?@AllanS.Hansen,这将取决于age的数据类型,尽管除int之外的任何数据类型都是odd@HoneyBadger事实上,使用不同的数据类型似乎可以进行转换。Case表达式,而不是Case语句。case表达式返回一个值。好吧,你可以把它和一个包含价格段的表结合起来。在关系数据库中,使用关联。当年龄为0时,返回0,但OP需要“1”??@Allan S.Hansen Yes Florage+1也可以。但是为什么我们需要对楼层功能而不是天花板再次执行+1返回直接答案。同意@AllanS.Hansen;由于条件1,但OP希望1返回2。确实如此not@Frisbee是的,在这种情况下,天花板不会产生所需的输出,但地板面积+1会产生所需的输出。您的回答实际上会引导我找到解决方案。谢谢