我有这个选择陈述
declare @t table (Percentage float)
DECLARE @acc INT
SET @acc = 1
DECLARE @max INT
select @max = max(HireID) from NewHire
WHILE (@acc <= @max)
BEGIN
IF (@acc in (select HireID from NewHire))
BEGIN try
insert into @t
select
CAST((select COUNT(*) from Hire_Response WHERE HireID = @acc AND (HireResponse = 0 OR HireResponse = 1)) as FLOAT) /
CAST((select COUNT(*) from Hire_Response WHERE HireID = @acc) as FLOAT)
END try
begin catch
insert into @t
select 0.0
end catch
set @acc = @acc + 1
END
select * from @t
在这段代码中,我循环遍历所有NewHire记录的id,从1到最高记录。我意识到这不再是我想要做的了。现在基本上我有一个名为sp_selectNewHire2SQL
的存储过程,它以特定的方式获取NewHire表。我想调用它,并获取它的返回记录集,然后从上到下循环。
注意:执行从id 1到最高的循环不再有效,因为id的顺序可能会混淆。
有办法吗?
感谢。
答案 0 :(得分:0)
select
NH.HireID,
ISNULL(1E0 *
COUNT(CASE WHEN HireResponse IN (0,1) THEN HR.HireID END) /
NULLIF(COUNT(HR.HireID), 0)
, 0) AS percentage
from
NewHire NH
LEFT JOIN
Hire_Response HR ON NH.HireID = HR.HireID
group by
NH.HireID
请注意,您需要在输出中包含HireID。除非使用ORDER BY,否则无法保证结果集的顺序,因此您不能假设您的百分比列表将按顺序排列
答案 1 :(得分:0)
基本上,您使用存储过程将返回的列创建临时表。然后通过执行存储过程作为插入的一部分将数据插入其中。然后使用select stament而不是value statment插入到表中。
或者你可以创建一个表值函数,该函数由存储过程赋予,并且只使用一个带有表值函数的select语句的插入的一步。