El problema es que en tu consulta no hay un elemento que relacione una columna con la otra. La relación que buscas es la posición ordinal ¿no?. Entonces, esto se soluciona encontrando la posición ordinal para ambos resultados y usar este valor como Id para vincularlos.
Con SQL Server 2000, lo solucionas usando tablas de paso. Como el juego de resultados es reducidísimo, lo mejor es usar variables de tabla:
Código:
--Tablas que contendrán los resultados. Las columnas
--IDENTITY se usaran para vincular ambos
DECLARE @topDesc TABLE(Id SMALLINT IDENTITY(1,1), CategoryID int)
DECLARE @topAsc TABLE(Id SMALLINT IDENTITY(1,1), CategoryID int)
--Obtener valores ascendentes
INSERT INTO @topAsc(CategoryID)
SELECT TOP 5 CategoryID
FROM products
ORDER BY num ASC
--Obtener valores descendentes
INSERT INTO @topDesc(CategoryID)
SELECT TOP 5 CategoryID
FROM products
ORDER BY num DESC
--Vincular ambos resultados
SELECT a.CategoryID AS CategoryIdAsc, d.CategoryID AS CategoryIdDesc
FROM @topAsc AS a
INNER JOIN @topDesc AS d
ON a.Id = d.Id
Con SQL Server 2005 es más fácil:
Código:
SELECT a.CategoryID AS CategoryIdAsc, d.CategoryID AS CategoryIdDesc
FROM (
SELECT TOP 5 CategoryID,
ROW_NUMBER() OVER(ORDER BY CategoryID ASC) AS Id
FROM products
) AS a
INNER JOIN (
SELECT TOP 5 CategoryID,
ROW_NUMBER() OVER(ORDER BY CategoryID DESC) AS Id
FROM products
) AS d
ON a.Id = d.Id