Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Ayuda con una consulta (UNION y ORDER BY)

Estas en el tema de Ayuda con una consulta (UNION y ORDER BY) en el foro de Bases de Datos General en Foros del Web. Hola, tengo que hacer una consulta que devuelva dni, nombre y apellido de las personas que hayan sido jugadores y tecnicos (no necesariamente a la ...
  #1 (permalink)  
Antiguo 20/11/2010, 21:53
 
Fecha de Ingreso: noviembre-2010
Mensajes: 8
Antigüedad: 14 años
Puntos: 0
Ayuda con una consulta (UNION y ORDER BY)

Hola, tengo que hacer una consulta que devuelva dni, nombre y apellido de las personas que hayan sido jugadores y tecnicos (no necesariamente a la vez, o sea puede haber sido jugador, tecnico, o jugador y tecnico a la vez), todo ordenado por el promedio de la calificacion obtenida como tecnico.

El problema es que yo lo pensé como un union, pero no se como manejar el group by, ya que despues de un union en un group by solamente se pueden usar los alias de las columnas de los selects (group by alias), y no usar el alias dentro de un subselect en el order by.
Si la consulta se puede resolver de otra forma que no sea con un union para evitar el problema del order by, no se cómo poría ser.

Yo lo pensé así:

select jugador_dni as dni, jugador_nombre, jugador_apellido from jugador
union
select tecnico_dni as dni, tecnico_nombre, tecnico_apellido from tecnico
order by (select avg(partido_calificacion_tecnico) from partido where partido_tecnico=dni)

Eso que hice en el order by no se puede, no anda... cómo podría ordenar los resultados de otra forma?

Entre los campos de la tabla partido, aparecen estos campos:
- partido_calificacion_tecnico (calificacion que se le dio a un arbitro en un partido)
- partido_tecnico (este campo es una FK con la tabla tecnico, que tiene tecnico_dni como PK)

Gracias, saludos!
  #2 (permalink)  
Antiguo 21/11/2010, 21:07
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Ayuda con una consulta (UNION y ORDER BY)

El order by se puede hacer haciendo referencia a la columna del producto cartesiano que se genere en la cosnsulta.
si pones ORDER BY 1 ordenará por la primera columna de la consulta. Puedes usar este mecanismo para no enredarte.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 21/11/2010, 21:50
 
Fecha de Ingreso: noviembre-2010
Mensajes: 8
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda con una consulta (UNION y ORDER BY)

Gracias por responder!

El tema es que necesito ordenar por el promedio de la calificacion obtenida como tecnico... y eso no está en ninguna columna, por lo que no puedo poner "order by numero_columna/alias".

Saludos!
  #4 (permalink)  
Antiguo 22/11/2010, 06:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Ayuda con una consulta (UNION y ORDER BY)

No te olvides que un ORDER BY puesto al final inhibe cualquier otro puesto anteriormente en un UNION. Es decir, ordenará todo el resultado en base a ese criterio.
Si lo que quieres es que te ordene los bloques independientemente, debes usar cada select como una subconsulta con su propio ORDER BY
Código MySQL:
Ver original
  1. FROM (SELECT.... FROM ... ORDER BY...) T1
  2. FROM (SELECT.... FROM ... ORDER BY...) T2
  3. ...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 22/11/2010, 08:23
 
Fecha de Ingreso: noviembre-2010
Mensajes: 8
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda con una consulta (UNION y ORDER BY)

Claro, pero en este caso quiero ordenar todo por el mismo criterio.. o sea necesito el order by al final.
Lo que no se es cómo hacer si el criterio por el que quiero ordenar no aparece en ninguna de las columnas de los selects de los union. Entonces no puedo poner "order by 1", o "order by alias_columna"... necesito una subconsulta sí o sí creo, pero cuando se usa union no se pueden poner subconsultas en el order by.

Saludos!
  #6 (permalink)  
Antiguo 22/11/2010, 08:54
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Ayuda con una consulta (UNION y ORDER BY)

Cita:
Lo que no se es cómo hacer si el criterio por el que quiero ordenar no aparece en ninguna de las columnas de los selects de los union. Entonces no puedo poner "order by 1", o "order by alias_columna"... necesito una subconsulta sí o sí creo, pero cuando se usa union no se pueden poner subconsultas en el order by.
Primero, si el valor no existe en ninguna de las tablas ¿cómo pretendes ordenarlo por ellas? ¿Cómo se relacionaría ese valor con cada registro de las otras tablas?
Estás planteando algo sin sentido.
La respuesta es obvia: Si existe alguna relación entre esos valores y los registros buscados, entonces la tabla donde se obtiene ese valor debe integrar el FROM de cada select...
Caso contrario estás planteando un imposible: Relacionar una tabla con la nada.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 22/11/2010, 09:25
 
Fecha de Ingreso: noviembre-2010
Mensajes: 8
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda con una consulta (UNION y ORDER BY)

Me refiero a que en una consulta donde no se usa union por ej se podría hacer esto:

select j.jugador_nombre, j.jugador_apellido
from jugador as j
order by (select sum(p.cantidad_puntos) from puntos as p where p.puntos_jugador=j.jugador_dni)

Entonces ahí estaría ordenando por un criterio que no es ninguna de las columnas del select principal.

Esto me lo tomaron en un exámen, y no supe resolverlo.. por eso pregunto acá a ver si alguno sabe alguna forma o si no se puede resolver.. para mí es imposible hacerlo, pero no conozco tanto sobre el tema como para decir "no existe forma de hacerlo".
El enunciado es el que puse arriba:

Tengo que hacer una consulta que devuelva dni, nombre y apellido de las personas que hayan sido jugadores y tecnicos (no necesariamente a la vez), todo ordenado por el promedio de la calificacion obtenida como tecnico.

Capáz que yo lo mal interpreté, no se que piensan ustedes.

Gracias por las respuestas!
  #8 (permalink)  
Antiguo 22/11/2010, 17:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Ayuda con una consulta (UNION y ORDER BY)

Código SQL:
Ver original
  1. SELECT j.jugador_nombre, j.jugador_apellido
  2. FROM jugador AS j
  3. ORDER BY (SELECT SUM(p.cantidad_puntos) FROM puntos AS p WHERE p.puntos_jugador=j.jugador_dni)
No lo pudiste resolver porque no lo analizaste bien: El orden de los puntajes es trascendente para ubicar el orden en PUNTOS, pero como eso no aparece en JUGADOR, debes buscar un atributo de JUGADOR que si aparezca en PUNTOS, y eso sólo puede ser una cosa:
JUGADOR_DNI.
A como lo veo yo, hay dos formas de lograr lo que quieres. La mejor es usar INNER JOIN:

Código MySQL:
Ver original
  1.    jugador_nombre,
  2.    jugador_apellido,
  3.    puntos
  4.    (SELECT
  5.       j.jugador_nombre,
  6.       j.jugador_apellido,
  7.       jugador_dni,
  8.       SUM(P.cantidad_puntos) PUNTOS
  9.    FROM  jugador  j INNER JOIN puntos p ON p.puntos_jugador=j.jugador_dni
  10.    GROUP BY j.jugador_dni) T1
  11. ORDER BY puntos;
Esto problablemente por cada SELECT del UNION.

La otra forma requiere de una función que no creo que te hayan enseñado, al menos como se me ocurre a mí

Código MySQL:
Ver original
  1.       j.jugador_nombre,
  2.       j.jugador_apellido
  3.       j.jugador_nombre,
  4. FROM  jugador  j
  5.     FIND_IN_SET(j.jugador_dni,
  6.         (SELECT GROUP_CONCAT(DISTINCT puntos_jugador) FROM
  7.               (SELECT puntos_jugador, SUM(cantidad_puntos) P FROM puntos GROUP BY P) T1
  8.         ORDER BY P ) );

Francamente, ni sé si funciona. Yo me quedaría con la otra.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 22/11/2010, 18:27
 
Fecha de Ingreso: noviembre-2010
Mensajes: 8
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda con una consulta (UNION y ORDER BY)

Gracias por la respuesta!

No me dejan hacer subconsultas en el from, solamente puedo poner los nombres de las tablas que ya existen.

Lo que yo hice fue:

select j.juga_nombre, j.juga_apellido from jugador as j
union
select dt.tecnico_nombre, dt.tecnico_apellido from tecnico as dt
order by (??????????)

Lo que se que NO puedo hacer es (usar un alias en una subconsulta en el order by):

select j.juga_dni as dni, j.juga_nombre, j.juga_apellido from jugador as j
union
select dt.tecnico_dni as dni, dt.tecnico_nombre, dt.tecnico_apellido from tecnico as dt
order by (select sum(p.cantidad_puntos) from puntos where p.puntos_jugador=dni)

Esto no lo puedo hacer porque estoy usando union. Lo que quise decir con el post anterior es que en una consulta simple (sin union) sí que podría poder una subconsulta en el order by.

Como vos me pusiste arriba, en el order by debería poner la columna puntos y para poder hacer esto esa columna tiene que estar en los selects del union, pero no tengo que mostrar los puntos, solamente el dni, el nombre y el apellido de las personas.

No se si logro hacer entender lo que no se resolver. Digamos que el problema es que no se cómo ordenar todo ese conjunto de datos que me devuelve el union según un criterio que no aparece en ninguna columna de los select.
Este problema no lo tendría si no usara union, porque ahí sí que podría poner lo que quiera en el order by.

Pero como tengo dos tablas (jugador y tecnico), y cada una tiene los datos de los jugadores y los tecnicos respectivamente, creo que no puedo resolverlo sin un union.

Saludos y gracias!
  #10 (permalink)  
Antiguo 22/11/2010, 19:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Ayuda con una consulta (UNION y ORDER BY)

Vamos a hacer un experimento, aprovechando las cualidades de MySQL.
¿Qué pasaría si hacemos esto?:

Código MySQL:
Ver original
  1.     j.juga_dni dni,
  2.     j.juga_nombre,
  3.     j.juga_apellido
  4. FROM jugador j
  5.     dt.tecnico_dni dni,
  6.     dt.tecnico_nombre,
  7.     dt.tecnico_apellido
  8. FROM tecnico dt
  9.     p.puntos_jugador dni,
  10.     NULL nombre,
  11.     NULL apellido
  12. FROM puntos p
  13. ORDER BY SUM(p.cantidad_puntos);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 22/11/2010, 19:57
 
Fecha de Ingreso: noviembre-2010
Mensajes: 8
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda con una consulta (UNION y ORDER BY)

Lo probé pero no me anduvo, creo que el problema es que en un union el group by tiene que ser general para todos los selects del union, entonces no reconce el p.cantidad_puntos. También me da error en "group by dni".

Estoy usando SQL SERVER, tiene que se lo mismo, pero no se si escribí en el foro equivocado :s.
  #12 (permalink)  
Antiguo 23/11/2010, 02:02
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Ayuda con una consulta (UNION y ORDER BY)

El DBMS afecta mucho, especialmente en el GROUP BY, porque MySQL le agrega ciertas capacidades, como poder agrupar por columnas que no están en el SELECT....
Deberías postear la duda, entonces, en el foro de SQL Server, a ver si la pueden resolver más rápido.

Tip: Cuando algo te de un error, por favor postea todo el mensaje del error. Decir "me dio un error" no es suficiente, no nos dice nada claro porque el error puede ser por muchas razones.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 23/11/2010, 06:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Ayuda con una consulta (UNION y ORDER BY)

Finalmente hice una prueba en MySQL de un modelo de consulta como la última mostrada, y es funcional si y sólo si le agrego un item más con valor cero en cada SELECT y un valor real en el último.

Fuera de esa posibilidad no he podido averiguar si hay algun modo de hacerlo en SQL Server. SI hubiese una función similar al FIND_IN_SET() de mysql, se podría, pero tal como está planteado parece una consulta imposible con esas restricciones.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 23/11/2010, 13:42
 
Fecha de Ingreso: noviembre-2010
Mensajes: 8
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda con una consulta (UNION y ORDER BY)

Si, me parece que no hay forma de resolverlo, y si se puede debe ser bastante rebuscada.

Gracias por tus respuestas y tu tiempo!

Saludos!

Etiquetas: order, union
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:30.