2014-02-14 23 views
1

這裏就是我想要做:在SQL Server中,我怎麼可能在一個循環中選擇頂@num%的

運行一個循環3次;每次我從表中分別隨機選擇5%,10%,15%。但是,在輸出表中,每行的'比率'列爲5,列名不是'比率'。輸出表中的第一列應顯示應用的比率,即包括5%,10%和15%。謝謝!

下面是我的代碼:

DECLARE @intFlag INT  
DECLARE @endFlag INT 
DECLARE @num INT 
DECLARE @totalScen INT 
SET @intFlag = 1 
SET @endFlag=5 
SET @num =5 
SET @totalScen =15 

WHILE (@num <= @totalScen) 
BEGIN 
WHILE (@intFlag <= @endFlag) 
BEGIN 

     WITH cte AS (select t1.gender, t1.age_group 

     from 
      (
      select * from mytable1 
      where caseid not in 
      (
       select top (@num) percent caseid from mytable1 

       order by newid() 
      ) 

      ) t1 
    ) 
    INSERT INTO newTable 
    SELECT @num as Ratio, gender, age_group 
    FROM cte 

SET @intFlag = @intFlag + 1 
END 
SET @[email protected]+5 
END 
GO 
+0

你試圖讓5個結果在每個比例? –

回答

0

我假設根據你的問題,你想內循環運行5倍你的每個比率值5,10,15。如果是這樣的話,你需要移動在內部循環使用內部循環的變量:

DECLARE @num INT  = 5 
     ,@totalScen INT = 15 
WHILE (@num <= @totalScen) 
BEGIN 
    DECLARE @intFlag INT = 1 
      ,@endFlag INT = 5 
    WHILE (@intFlag <= @endFlag) 
    BEGIN 
      WITH cte AS (select t1.gender, t1.age_group 
         from (select * 
           from mytable1 
           where caseid not IN (select top (@num) percent caseid 
                from mytable1 
                order by newid() 
                ) 
          ) t1 
         ) 
      INSERT INTO newTable 
      SELECT @num as Ratio, gender, age_group 
      FROM cte 
    SET @intFlag = @intFlag + 1 
    END 
SET @[email protected]+5 
END 
GO 

簡單的方法來測試行爲是印刷變量:

DECLARE @num INT  = 5 
     ,@totalScen INT = 15 
WHILE (@num <= @totalScen) 
BEGIN 
    DECLARE @intFlag INT = 1 
      ,@endFlag INT = 5 
    WHILE (@intFlag <= @endFlag) 
    BEGIN 

    PRINT @num 
    PRINT @intflag 

    SET @intFlag = @intFlag + 1 
    END 
SET @[email protected]+5 
END 
GO 
0

你的問題來自於內環值永遠不會重置它的自我。您必須移動

SET @intFlag = 1 
    SET @endFlag = 5 

在您的外部循環中。像這樣。

DECLARE @intFlag INT 
    ,@endFlag INT 
    ,@num INT 
    ,@totalScen INT 

SET @num = 5 
SET @totalScen = 15 

WHILE (@num <= @totalScen) 
    BEGIN 
     SET @intFlag = 1 
     SET @endFlag = 5 
     WHILE (@intFlag <= @endFlag) 
      BEGIN 
       PRINT '@intFlag:' + CONVERT(VARCHAR(2), @intFlag) 
       SET @intFlag = @intFlag + 1 
      END 
     PRINT '@num2:' + CONVERT(VARCHAR(2), @num) 
     SET @num = @num + 5 
    END 

總是最好使用PRINT看什麼重視您的變量,而不是假設它是正確的行爲。