Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Casi, casi, ..., ERROR!!!

1,240 views
Skip to first unread message

David

unread,
Apr 4, 2008, 2:13:45 PM4/4/08
to
Microsoft SQL Server 2000
-----------------------------

Muy buenas, por imperativo necesito devolver una serie de registros
perteneciente a una tabla Y AÑADIRLE la "posibilidad" de "TODOS" y que este
sea el primero y al mismo tiempo ordenados alfabéticamente (campo nombre),
es decir, imaginar que en la tabla se almacena:

Id: INT
nombre: STRING

1 Pepe
2 Juan
3 Antonio
4 Bartolo

La consulta debería devolver los registros ORDENADOS por el campo NOMBRE,
pero incluyendo "el registro" Todos en primer lugar:

0 Todos
3 Antonio
4 Bartolo
2 Juan
1 Pepe


He hecho la siguiente consulta QUE FUNCIONA SIN la clásula UNION (haciendo
trampas, añadiendo un registro FANTASMA llamado todos - NO NO !!! ESO no lo
puedo hacer porque la tabla de donde estraigo los datos la uso para otras
cosas y ese registro fantasma estaría MOLESTADO)

Consulta:
---------
(SELECT [id],nombre FROM table)

UNION ALL

(SELECT 0 AS [id],'Todos' AS nombre)

ORDER BY (CASE WHEN [id]=0 then '' ELSE nombre END)

Me da el siguiente error:

Error:
104
"Debe haber elementos ORDER BY en la lista de selección si la instrucción
contiene el operador UNION"

¿Alguna ayuda?

Nota: mil gracias de antemano

Carlos M. Calvelo

unread,
Apr 4, 2008, 2:29:23 PM4/4/08
to

Hola David,

Prueba asi:

SELECT 1 as Grupo, [id], nombre FROM table
UNION ALL
SELECT 0 as Grupo, 0 AS [id], 'Todos' AS nombre
ORDER BY Grupo, nombre

Saludos,
Carlos

David

unread,
Apr 4, 2008, 3:09:00 PM4/4/08
to
Lo bueno, si breve, simple, claro, sin complicaciones, ..., dos veces bueno.

Muchísimas gracias por tú tiempo y CONOCIMIENTOS.

Por cierto, una curiosidad, ¿por qué en mi consulta daba ese error?

Carlos M. Calvelo

unread,
Apr 4, 2008, 3:50:36 PM4/4/08
to


Porque el ORDER BY sobre una UNION solo acepta los nombres
de la columnas especificadas en el primer SELECT de la UNION,
que es el que define los nombres y tipos de las columnas
para el resultado de la UNION.
Casi literalmente lo que dice el error. No le busques razones lógicas.
Digamos que es así 'by design'.

Saludos,
Carlos

Alejandro Mesa

unread,
Apr 4, 2008, 8:28:01 PM4/4/08
to
David,

Es uno de esos errores dificiles de comprender. Creo que el problema lo trae
funcion CASE. Si estas seguro que los valores de [id] son mayores que cero,
puedes lograr lo mismo usando:

(SELECT [id],nombre FROM table)

UNION ALL

(SELECT 0 AS [id],'Todos' AS nombre)

ORDER BY [id], nombre;


AMB

Carlos M. Calvelo

unread,
Apr 5, 2008, 5:17:58 AM4/5/08
to
Hola Alejandro,

On 5 apr, 02:28, Alejandro Mesa


<AlejandroM...@discussions.microsoft.com> wrote:
> David,
>
> Es uno de esos errores dificiles de comprender. Creo que el problema lo trae
> funcion CASE.

Yo no consigo hacer uso de *cualquier* otra función, o expresión que
no sea solo el nombre de una columna, en el group by sobre una unión.

Saludos,
Carlos

Alejandro Mesa

unread,
Apr 5, 2008, 10:52:01 AM4/5/08
to
Carlos M. Calvelo,

De acuerdo, me referi a la funcion CASE porque es la que estavamos usando.
Creo que aunque la solucion que mencione pudiera ser de ayuda, lo mas
practico seria usar una tabla derivada o CTE.

select *
from
(
blablabla
union all
blablabla
)
order by case when [id] = 0 then 1 else 2 end ASC, [id], nombre


AMB

Carlos M. Calvelo

unread,
Apr 5, 2008, 11:48:58 AM4/5/08
to
On 5 apr, 16:52, Alejandro Mesa

<AlejandroM...@discussions.microsoft.com> wrote:
> Carlos M. Calvelo,
>
> De acuerdo, me referi a la funcion CASE porque es la que estavamos usando.
> Creo que aunque la solucion que mencione pudiera ser de ayuda, lo mas
> practico seria usar una tabla derivada o CTE.
>
> select *
> from
> (
> blablabla
> union all
> blablabla
> )
> order by case when [id] = 0 then 1 else 2 end ASC, [id], nombre
>

De acuerdo Alejandro. O una vista en SS2000.
Vaya cosas tiene el SQL!

SELECT * FROM X
y simplemente X deberían ser equivalentes.

En este caso siendo X una union pero por mi parte también
si fuera simplemente una tabla base.

Saludos,
Carlos

0 new messages