separate between rows DECLARE @yourtable TABLE (id int, [name] varchar(100), category_sort varchar(100));
INSERT @yourtable VALUES
(1, 'Campaign1','Beverage'),
(2, 'Campaign2','Beverage'),
(3, 'Campaign3','Food'),
(4, 'Campaign4','Beverage'),
(5, 'Campaign5','Hot Drinks'),
(6, 'Campaign6','Advertizing'),
(7, 'Campaign7','Marketing');

WITH x AS
(
SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY category_sort ORDER BY id)
FROM @yourtable
)
SELECT id, name, category_sort
FROM x
ORDER BY rn, category_sort;


Now when i run the above code it is return :

6 Campaign6 Advertizing
1 Campaign1 Beverage
3 Campaign3 Food
5 Campaign5 Hot Drinks
7 Campaign7 Marketing
2 Campaign2 Beverage
4 Campaign4 Beverage


But actually what i need is :

6 Campaign6 Advertizing
1 Campaign1 Beverage
3 Campaign3 Food
5 Campaign5 Hot Drinks
2 Campaign2 Beverage
7 Campaign7 Marketing
4 Campaign4 Beverage
This will work I think:

WITH x AS
(
    SELECT *, rn = ROW_NUMBER() OVER (ORDER BY category_sort, id) - 1,
              halfsize = (1 + COUNT(*) OVER ()) / 2
    FROM @yourtable
)
SELECT id, name, category_sort
FROM x
ORDER BY rn % halfsize, rn ;


Test at dbfiddle.uk:



id | name      | category_sort
-: | :-------- | :------------
 6 | Campaign6 | Advertizing  
 3 | Campaign3 | Food         
 1 | Campaign1 | Beverage     
 5 | Campaign5 | Hot Drinks   
 2 | Campaign2 | Beverage     
 7 | Campaign7 | Marketing    
 4 | Campaign4 | Beverage