带有变量的case语句的ABC分析

时间:2018-03-26 15:48:51

标签: sql sql-server variables case

嘿我试图在一个单独的列中使用一个变量在我的表中进行ABC分析但是我的代码失败了。如何修复代码以使其工作? 这是我的表:

declare @t  table (id int, years int)
insert into @t values 
(1, 22),
(2, 45),
(3, 87)

这是我的代码失败:

declare @age int
set @age = years 

select *,
case
    when @age < 25 then 'a'
    when @age < 50 then 'b'
    else 'c'
end as abc
from @t

谢谢!

1 个答案:

答案 0 :(得分:1)

set @age = years无效 - 只需删除@age并在查询中替换为years

declare @t  table (id int, years int)
insert into @t values 
(1, 22),
(2, 45),
(3, 87)    

select *,
case
    when years < 25 then 'a'
    when years < 50 then 'b'
    else 'c'
end as abc
from @t

更多解释:您可以使用select:set @age = (SELECT years FROM @t)将变量设置为列,但这也会失败,因为变量只能包含单个值。

因此,要实际采用该方法,您必须将变量设置为单个值并循环遍历所有值:

WHILE (condition)
BEGIN
SET @age = (SELECT MAX(years) FROM @t) --something limiting to one value
Query here...
END

循环通常很慢,避免它更好。在某些情况下,当然有必要,但幸运的是,您可以在案例中引用years

修改:如果您必须使用变量@age进行练习或其他内容:

DECLARE @id int = 1
DECLARE @Age int

WHILE (SELECT MAX(id) FROM @t) < @id
BEGIN
SET @Age = (SELECT years FROM @t WHERE id = @id)
select *,
       case when @age < 25 then 'a'
            when @age < 50 then 'b'
            else 'c'
       end as abc
from @t

SET @id = @id + 1
END

注意:这里的SELECT在循环的上下文中没有多大意义,但仅举例来说