2013-05-14 40 views
0

我有這樣的select語句如何循環選擇語句?

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 

在這段代碼中,我被它的ID通過所有的NewHire記錄循環,從1到最高的國家之一。我意識到這不是我想要做的。現在基本上我有這個名爲sp_selectNewHire2SQL的存儲過程,它以特定的方式獲取NewHire表。我想調用它,並獲取它的返回記錄集,然後從上到下循環。

注意:做來自ID循環來最高不會工作了,因爲編號的順序可以混合起來。

有沒有辦法做到這一點?

謝謝。

+4

你有沒有考慮一個單一的SELECT?不需要循環。另外,添加存儲過程不會增加值。 DRY對於SQL代碼並不總是好的 – gbn 2013-05-14 14:49:54

+0

如何用單個select語句執行此操作?此外,我想調用存儲過程,因爲我的經典代碼,調用存儲過程,我不想在不同的地方有相同的代碼。 – omega 2013-05-14 14:51:18

+1

「我不想在不同的地方使用相同的代碼。」你不應該。每個代碼都做了一些不同的事情,所以你沒有重複......並且「我意識到這不是我想要做的事了」=你現在需要什麼處理? – gbn 2013-05-14 14:55:22

回答

3

作爲一個SELECT,像這樣

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 
+0

AS附近存在語法錯誤。 – omega 2013-05-14 15:00:24

+0

@omega:固定... – gbn 2013-05-14 15:01:38