На сервере SQL, как я могу выбрать верхний процент @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 @num=@num+5
END
GO

2 ответа

Решение

Исходя из вашего вопроса, я предполагаю, что вы хотите, чтобы внутренний цикл выполнялся 5x для каждого из ваших значений отношения 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 @num=@num+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 @num=@num+5
END
GO

Ваша проблема исходит из значения внутреннего цикла, никогда не сбрасывающего его самостоятельно. Вы должны двигаться

    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 чтобы увидеть, какие значения имеют ваши переменные, вместо того, чтобы предполагать, что они ведут себя правильно.

Другие вопросы по тегам