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

Función de agregación

Estas en el tema de Función de agregación en el foro de Bases de Datos General en Foros del Web. Hola, mi problema creo que debe ser bastante facil de solucionar. El tema es que tengo una tabla de impresoras la cual tiene los siguientes ...
  #1 (permalink)  
Antiguo 19/10/2010, 10:09
 
Fecha de Ingreso: diciembre-2006
Mensajes: 27
Antigüedad: 17 años, 11 meses
Puntos: 0
Función de agregación

Hola, mi problema creo que debe ser bastante facil de solucionar. El tema es que tengo una tabla de impresoras la cual tiene los siguientes campos: codigo, modelo, tipo, velocidad (paginas por minutos) y fabricante.
Yo necesito hacer una consulta SQL que me muestre el fabricante de la impresora mas rápida, osea la que imprime mas pagina por minuto y dicha velocidad.
Yo escribo la siguiente consulta:
"SELECT Fabricante, MAX(velocidad)
FROM Impresora"
Pero me salta un error que dice: "Ha intentado ejecutar una consulta que no incluye la expresión especificada 'Fabricante' como parte de una función de agregado".
Si le saco el campo Fabricante en la clausula SELECT me ejecuta la consulta pero solo me muestra la velocidad y yo quiero saber a qué fabricante pertenece.
Alguien me puede ayudar??? Gracias!
  #2 (permalink)  
Antiguo 19/10/2010, 11:11
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Función de agregación

Buenos días gfg08:

La función Max pertenece a un grupo especial de funciones llamadas de agrupación (junto con min, count, sum, etc). Estas funciones generalmente deberán ir acompañadas de la cláusula GROUP BY. Me imagino que eses novat@ en estos temas, así es que te recomiendo que le des una revisada a cualquier libro o manual de SQL para que aprendas el uso de estas funciones.

Ahora bien, con respecto a tu problema este es ocasionado justamente por que no tienes la cláusula GROUP BY. trataré de explicar con un ejemplo para ver si queda más claro:

Supongamos que tienes los siguientes datos

Código:
Codigo|Modelo|Tipo|Velocidad
-----------------------------
1|HP|Tipo 1|10
2|HP|Tipo 2|20
3|Epson|Tipo 1|15
4|Epson|Tipo 2|18
5|ACME|Tipo 2|2
6|ACME|Tipo 3|14
si haces esto:

Código SQL:
Ver original
  1. SELECT Modelo, MAX(Velocidad) AS velocidad FROM Impresoras
  2. GROUP BY modelo

el resultado sería este

Código:
Modelo|Velocidad
------------------
2|HP|20
4|Epson|18
6|ACME|14
es decir, la impresora más rápida para cada una de los modelos que tienes. Ahora bien por lo que comentas tú necesitas la más rápida de todas, para esto entonces tienes que hacer una subconsulta que te obtenga primero cual es la velocidad máxima para filtrar los registros de tu tabla. puedes hacerlo así

Código SQL:
Ver original
  1. SELECT modelo, velocidad FROM Impresoras
  2. WHERE Velocidad = (SELECT MAX(velocidad) FROM Impresoras)

o utilizando un INNER JOIN

Código SQL:
Ver original
  1. SELECT modelo, velocidad FROM Impresoras I
  2. INNER JOIN
  3. (
  4. SELECT MAX(velocidad) AS max_velocidad FROM Impresoras
  5. ) T
  6. ON T.max_velocidad = I.Velocidad

Saludos
Leo.
  #3 (permalink)  
Antiguo 26/10/2010, 08:21
 
Fecha de Ingreso: diciembre-2006
Mensajes: 27
Antigüedad: 17 años, 11 meses
Puntos: 0
Respuesta: Función de agregación

Leo, antes que nada disculpas por no responder antes, pero te cuento que me sirvió mucho lo que me explicaste en el foro.
Use la consulta de la forma que me dijiste: SELECT modelo, velocidad FROM Impresoras
WHERE Velocidad = (SELECT Max(velocidad) FROM Impresoras)
Y obtuve lo que quería. Estaba equivocado antes y pensaba que cometía algún error en la consulta pero como vos me dijiste no se podía hacer de esa manera, asi que gracias por aclararme la duda . Estamos en contacto.

Etiquetas: bases-de-datos
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 14:22.