Таким образом, вы указываете число @n, которое вы хотите.
Вы предоставляете @x в процентах от тех пользователей, у которых должны быть изображения.
select top (@n) *
from
(
select top (@n * @x / 100) *
from users
where picture is not null
union all
select top (@n) *
from users
where picture is null
) u
order by case when picture is not null then 1 else 2 end;
Итак ... вам нужно не более @n * @x / 100 пользователей, у которых есть картинки, а остальные должны быть людьми, у которых нет картинок. Таким образом, я делаю «союз всех» между моими @ n * @ x / 100 картинными людьми и достаточным количеством других, чтобы завершить мой @n. Затем я отбираю их обратно, заказываю свой ТОП, чтобы убедиться, что у меня есть люди, у которых есть фотография.
Rob
Отредактировано: На самом деле, это было бы лучше:
select top (@n) *
from
(
select top (@n * @x / 100) *, 0 as NoPicture
from users
where picture is not null
union all
select top (@n) *, 1 as NoPicture
from users
where picture is null
) u
order by NoPicture;
... потому что это устраняет влияние ORDER BY.