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