嘿我试图在一个单独的列中使用一个变量在我的表中进行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
谢谢!
答案 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
在循环的上下文中没有多大意义,但仅举例来说