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

ayuda con group by y sumar

Estas en el tema de ayuda con group by y sumar en el foro de Mysql en Foros del Web. hola pues estoy haciendo una consulta donde me arroja resultados asi: nombre | manzanas | peras | total juan | 2 | 1 | 3 ...
  #1 (permalink)  
Antiguo 14/12/2009, 15:32
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
ayuda con group by y sumar

hola pues estoy haciendo una consulta donde me arroja resultados asi:


nombre | manzanas | peras | total
juan | 2 | 1 | 3
juan | 1 | 0 | 1
juan | 1 | 0 | 1
juan | 0 | 1 | 1
antonio | 1 | 5 | 6
antonio | 8 | 0 | 8
Raul | 4 | 9 | 13
Raul | 2 | 5 | 7


donde "total" no es un campo, sino que yo manualmente hago una suma de "manzanas + peras", nombre, manzanas y peras es un campo. practicamente lo que hago actualmente es una consulta "select * from tabla" (a veces con where condicion) y me va imprimiendo uno por uno (registros)

lo que necesito hacer es que me de un resultado como:

nombre | manzanas | peras | total
juan | 4 | 2 | 6
antonio | 9 | 5 | 14
Raul | 6 | 14 | 20


pero no se como hacer eso en el sql se que debo usar group pero no se como aplicarlo, agradezco su ayuda.


  #2 (permalink)  
Antiguo 14/12/2009, 15:52
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: ayuda con group by y sumar

Creo que ese campo total no es necesario, piensa que si cambias un dato, tendrás que cambiar también el total, y eso es un campo calculado que siempre podrás obtener con una consulta sin tener que almacenarlo.
SELECT nombre, sum(peras) peras, sum(manzanas) manzanas, sum(peras+manzanas) total GROUP BY nombre
  #3 (permalink)  
Antiguo 14/12/2009, 18:37
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
Respuesta: ayuda con group by y sumar

Cita:
Iniciado por jurena Ver Mensaje
Creo que ese campo total no es necesario, piensa que si cambias un dato, tendrás que cambiar también el total, y eso es un campo calculado que siempre podrás obtener con una consulta sin tener que almacenarlo.
SELECT nombre, sum(peras) peras, sum(manzanas) manzanas, sum(peras+manzanas) total GROUP BY nombre
gracias por la respuesta, efectivamente no es un campo el "total", por cierto si estoy usando php, como hago para imprimir "sum(manzanas)" y "sum(peras)" ?
  #4 (permalink)  
Antiguo 14/12/2009, 18:54
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: ayuda con group by y sumar

lo imprimes con el alias que en este caso sería total.

a la consulta de jurena solo le faltó especificar la tabla :P

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 14/12/2009, 18:55
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
Respuesta: ayuda con group by y sumar

Cita:
Iniciado por huesos52 Ver Mensaje
lo imprimes con el alias que en este caso sería total.

a la consulta de jurena solo le faltó especificar la tabla :P

saludos
no entendi
  #6 (permalink)  
Antiguo 14/12/2009, 18:58
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: ayuda con group by y sumar

según te entiendo, en php llamas una consulta y recuperas los campos de los registros mediante el nombre del campo. Cuando usas funciones de agrupación (como sum, count, max etc) puedes acceder a los campos de la consulta mediante los alias.

No es eso lo que preguntas?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 14/12/2009, 18:59
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
Respuesta: ayuda con group by y sumar

Cita:
Iniciado por huesos52 Ver Mensaje
según te entiendo, en php llamas una consulta y recuperas los campos de los registros mediante el nombre del campo. Cuando usas funciones de agrupación (como sum, count, max etc) puedes acceder a los campos de la consulta mediante los alias.

No es eso lo que preguntas?
si si, pero no me quedo claro como se convirtio "total" en alias (por que el ejemplo que daban arriba entendi que el usuario habia entendido que yo usaba "total" como campo y no es asi)
  #8 (permalink)  
Antiguo 14/12/2009, 19:04
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: ayuda con group by y sumar

lo que te dice jurena es que total es un campo calculado pero este no pertenece a la estructura de la tabla.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #9 (permalink)  
Antiguo 14/12/2009, 19:32
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
Respuesta: ayuda con group by y sumar

um, pero saben, kreo ke me equivoque, la estructura de la base de datos no es asi mas bien es

nombre - almacena el nombre de personas
fruta - se guarda el tipo de fruta "peras", "manzanas"

entonces de igual forma debo poner:

nombre | cantidadperas | cantidadmanzanas | cantidadtotal

y al final un "total" de todas las cantidades totales


por cierto, lei un poco mas y ya entendi que los alias se establecen con "as" por ejemplo "sum(cosas) as suma"

gracias por toda la ayuda, que puedo hacer ahora?
  #10 (permalink)  
Antiguo 14/12/2009, 19:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: ayuda con group by y sumar

Cita:
entonces de igual forma debo poner:

nombre | cantidadperas | cantidadmanzanas | cantidadtotal

y al final un "total" de todas las cantidades totales
No. Una de las reglas generales del diseño de una base de datos relacional es que no se ponen campos que deban contener valores que pueden ser calculados o que son el resultado de cálculos realizables por medio de funciones de agregación.
Esto se hace porque al DBMS le lleva menos tiempo realizar ese cálculo en la ejecución de la sentencia, que el tiempo necesario para levantar un campo adicional ya que este implica eventualmente más tiempo de overhead, por el espacio adicional necesario para ese dato.
Si esto te parece superfluo, recuerda que un campo DECIMAL, DOUBLE o FLOAT insume 8 Bytes, lo que significa que 8.000 registros le suman al sistema un acceso a disco adicional y un bloque de datos desperdiciado...

¿Se comprende la idea?

En lugar de eso, ponerlo en la sentencia select usando una función agrupada, implica 8 bytes x N, siendo N la cantidad de registros efectivamente devueltos. Esto implica que si consulta 84.000 registros para devolver 150 como resumen, eso significa un uso de 1200 bytes adicionales (estos son cálculos al vuelo, pero el esquema es ese), que está muy lejos de los 11 bloques adicionales requeridos si hubiese un campo adicional en la tabla...

Corolario: Una de las claves del diseño de bases de datos es, también, que se debe ahorrar todo el espacio de datos necesario, porque los medios de almacenamiento son finitos, y el exceso de bytes generan cuellos de botella en los sistemas de transmisión (léase: Internet)

Nota: La única excepción a la primera regla son los DataWarehouse, pero eso es otro tema totalmente diferente, que se basa en un paradigma distinto y apunta a sistemas de cierto tipo.
__________________
¿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 14/12/2009, 19:51
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
Respuesta: ayuda con group by y sumar

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No. Una de las reglas generales del diseño de una base de datos relacional es que no se ponen campos que deban contener valores que pueden ser calculados o que son el resultado de cálculos realizables por medio de funciones de agregación.
Esto se hace porque al DBMS le lleva menos tiempo realizar ese cálculo en la ejecución de la sentencia, que el tiempo necesario para levantar un campo adicional ya que este implica eventualmente más tiempo de overhead, por el espacio adicional necesario para ese dato.
Si esto te parece superfluo, recuerda que un campo DECIMAL, DOUBLE o FLOAT insume 8 Bytes, lo que significa que 8.000 registros le suman al sistema un acceso a disco adicional y un bloque de datos desperdiciado...

¿Se comprende la idea?

En lugar de eso, ponerlo en la sentencia select usando una función agrupada, implica 8 bytes x N, siendo N la cantidad de registros efectivamente devueltos. Esto implica que si consulta 84.000 registros para devolver 150 como resumen, eso significa un uso de 1200 bytes adicionales (estos son cálculos al vuelo, pero el esquema es ese), que está muy lejos de los 11 bloques adicionales requeridos si hubiese un campo adicional en la tabla...

Corolario: Una de las claves del diseño de bases de datos es, también, que se debe ahorrar todo el espacio de datos necesario, porque los medios de almacenamiento son finitos, y el exceso de bytes generan cuellos de botella en los sistemas de transmisión (léase: Internet)
yo lo se amigo, "cantidadtotal" no es un campo es un "valor", igual el "total de las cantidades totales", toda esa información en teoria se saca de 2 campos de la tabla, "nombre" y "fruta"
  #12 (permalink)  
Antiguo 14/12/2009, 19:55
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
Respuesta: ayuda con group by y sumar

en la base de datos esta asi:

tabla: frutas
clave | fruta
1 | manzanas
2 | peras

tabla: clientes
nombre | fruta
juan | 1
juan | 2
juan | 2
pedro | 1
pedro | 2
ruth | 1


debo imprimi:
juan tiene 1 manzanas y 2 peras, en total tiene 3 frutas
pedro tiene 1 manzanas y 1 peras, en total tiene 2 frutas
ruth tiene 1 manzanas y 0 peras, en total tiene 1 frutas


me explico? la bd (tabla clientes) consta de solo 2 campos

que igual eso de que me diga "tiene n manzanas y m peras" es lo mismo para mi que "tiene n 1 y m 2" por que ya reemplazar "1" y "2" se que lo puedo hacer con otra "sub consulta" (por decirlo de una forma)


en si, lo que no se como hacer es, hacer los grupos y contar.



gracias por la ayuda, disculpen tanto enredo
  #13 (permalink)  
Antiguo 14/12/2009, 21:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: ayuda con group by y sumar

Esta sería una opción:
Código MySQL:
Ver original
  1.    C.nombre, SUM(IF(c.fruta=1, 1, 0)) Manzanas,
  2.    SUM(IF(c.fruta=2, 1, 0)) Peras,
  3.    COUNT(c.fruta) `Total Frutas`
  4. FROM clientes C INNER JOIN frutas F ON C.fruta = F.clave
  5. WHERE F.clave IN (1, 2)
  6. GROUP BY c.nombre;
IF(condicion, verdadero, falso), devuelve verdadero si la condicion es TRUE, sino devuelve falso.
SUM() suma los valores indicados, donde el valore devuelto no sea NULL. En este caso va sumando 1 ó 0, contando las alternativas.
COUNT() cuenta todos los valores no NULL de un campo.
INNER JOIN devuelve sólo los registros que coincidan en la condición ON.
Los alias son precisamente eso: Alias de un nombre de base de datos, de tabla o de campo, puestos sea para cambiar el encabezado devuelto, para que sea útil, o bien para reducir la longitud de las sentencias haciendo más clara y comprensible la escritura. Originalmente requerían la cláusulas AS para indicar el alias. Actualmente es opcional. El sólo poner una palabra a continuación es suficiente.

Atención: Los alias de los campos no pueden ser usados para referirse a ellos en la cláusula WHERE.
__________________
¿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 15/12/2009, 11:15
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
Respuesta: ayuda con group by y sumar

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Esta sería una opción:
Código MySQL:
Ver original
  1.    C.nombre, SUM(IF(c.fruta=1, 1, 0)) Manzanas,
  2.    SUM(IF(c.fruta=2, 1, 0)) Peras,
  3.    COUNT(c.fruta) `Total Frutas`
  4. FROM clientes C INNER JOIN frutas F ON C.fruta = F.clave
  5. WHERE F.clave IN (1, 2)
  6. GROUP BY c.nombre;
IF(condicion, verdadero, falso), devuelve verdadero si la condicion es TRUE, sino devuelve falso.
SUM() suma los valores indicados, donde el valore devuelto no sea NULL. En este caso va sumando 1 ó 0, contando las alternativas.
COUNT() cuenta todos los valores no NULL de un campo.
INNER JOIN devuelve sólo los registros que coincidan en la condición ON.
Los alias son precisamente eso: Alias de un nombre de base de datos, de tabla o de campo, puestos sea para cambiar el encabezado devuelto, para que sea útil, o bien para reducir la longitud de las sentencias haciendo más clara y comprensible la escritura. Originalmente requerían la cláusulas AS para indicar el alias. Actualmente es opcional. El sólo poner una palabra a continuación es suficiente.

Atención: Los alias de los campos no pueden ser usados para referirse a ellos en la cláusula WHERE.


wow que respuesta tan buena, pero sabes hay algo que no entiendo:

WHERE F.clave IN (1, 2)

para que y en que forma usas eso y todos sus argumentos? gracias.
  #15 (permalink)  
Antiguo 15/12/2009, 11:45
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: ayuda con group by y sumar

Para eso es muy buena idea leer el manual: 12.1.3. Funciones y operadores de comparación

Cita:
expr IN (value,...)

Retorna 1 si expr es uno de los valores en la lista IN , de lo contrario retorna 0. Si todos los valores son constantes, se evalúan según el tipo y ordenación de expr . La búsqueda para el elemento se hace usando búsqueda binaria. Esto significa que IN es muy rápido si la lista IN consiste enteramente en constantes. Si expr es una expresión de cadenas de caracteres sensible a mayúsculas, la comparación de cadenas se realiza sensible a mayúsculas.

mysql> SELECT 2 IN (0,3,5,'wefwf');
-> 0
mysql> SELECT 'wefwf' IN (0,3,5,'wefwf');
-> 1

El número de valores en la lista IN sólo está limitado por el valor max_allowed_packet.

En MySQL 5.0, para cumplir el estándar SQL IN retorna NULL no sólo si la expresión de la parte izquierda es NULL, también si no encuentra coincidencias en la lista y una de las expresiones en la lista es NULL.

La sintaxis de IN() puede usarse para escribir algunas subconsultas. Consulte Sección 13.2.8.3, “Subconsultas con ANY, IN y SOME”.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #16 (permalink)  
Antiguo 15/12/2009, 11:55
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
Respuesta: ayuda con group by y sumar

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Para eso es muy buena idea leer el manual: 12.1.3. Funciones y operadores de comparación
lo lei pero no le entendi
  #17 (permalink)  
Antiguo 15/12/2009, 12:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: ayuda con group by y sumar

¿Qué es lo que no entiendes del capítulo?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #18 (permalink)  
Antiguo 15/12/2009, 12:19
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
Respuesta: ayuda con group by y sumar

IN (0,3,5,'wefwf')

que es 0,3,5, wefwf?

es valor que esta en la tabla? o que eS?
  #19 (permalink)  
Antiguo 15/12/2009, 12:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: ayuda con group by y sumar

Es un ejemplo dado en el manual...

¿Nunca has probado ejecutar un SELECT sin tabla, para ver qué pasaba?

Código MySQL:
Ver original
  1. SELECT 'A';

Bueno, prueba hacer:
Código MySQL:
Ver original
  1. SELECT 2 IN (0,3,5,'wefwf');
y también
Código MySQL:
Ver original
  1. SELECT 'wefwf' IN (0,3,5,'wefwf');
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #20 (permalink)  
Antiguo 15/12/2009, 14:05
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
De acuerdo Respuesta: ayuda con group by y sumar

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Es un ejemplo dado en el manual...

¿Nunca has probado ejecutar un SELECT sin tabla, para ver qué pasaba?

Código MySQL:
Ver original
  1. SELECT 'A';

Bueno, prueba hacer:
Código MySQL:
Ver original
  1. SELECT 2 IN (0,3,5,'wefwf');
y también
Código MySQL:
Ver original
  1. SELECT 'wefwf' IN (0,3,5,'wefwf');
xD me estalla la cabeza mi logica no da para mas xD


bueno gracias por la ayuda, ya pude lograr lo que necesitaba :)
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 05:31.