Puede ser con un While y un Cursor (ambos) o puedes hacerlo con un solo SELECT... Ambas alternativas son análogas, pero la primera requiere más líneas de código, pero la segunda es más compleja de implementar...
Lo que tienes que tener presente es que por cada ciclo tienes que generar las columnas y un join para la misma tabla... Como ejemplo para que me entiendas la idea:
DECLARE @Cols VARCHAR(MAX)
Declare @join varchar(max)
SELECT @Cols = @Cols + ', Tabla' + LTRIM(STR(ROW_NUMBER())) + '.campo1, Tabla' + LTRIM(STR(ROW_NUMBER())) + '.campo2, ',
@Join = @Join + 'INNER JOIN MiTabla Tabla' + LTRIM(STR(ROW_NUMBER())) + ' ON MiTabla.campo1 = Tabla' + LTRIM(STR(ROW_NUMBER())) + '.campo 1 '
FROM MiTabla
WHERE MiTabla.campo1 = 'algo'
SET @Cols = 'SELECT ' + @Cols + ' FROM MiTabla ' + @Join + ' WHERE MiTabla.campo1 = ''algo'''
--PRINT @Cols
EXEC(@Cols)
Esa es un poco la idea... en una variable ir generando las columnas dinámicas y en otra los join con la misma tabla... La consulta para generar esas variables tiene que ser inteligente, en el sentido que debe traer las rutas comunes (y no comunes) para todas las unidades que listarás... Y además que no se repitan... Por ejemplo:
Unidad Ruta
Unidad1 Ciudad1
Unidad2 Ciudad1
Unidad2 Ciudad2
En ese ejemplo, sólo deberías traer la Ciudad1 y Ciudad2 para ambas unidades...