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

[SOLUCIONADO] Obtener total y subtotales

Estas en el tema de Obtener total y subtotales en el foro de Bases de Datos General en Foros del Web. Buenos días, soy nueva, no sabía si poner este post en algún subforo así que lo he puesto en el general, espero no equivocarme... al ...
  #1 (permalink)  
Antiguo 09/06/2015, 02:16
 
Fecha de Ingreso: abril-2015
Mensajes: 45
Antigüedad: 9 años
Puntos: 0
Obtener total y subtotales

Buenos días, soy nueva, no sabía si poner este post en algún subforo así que lo he puesto en el general, espero no equivocarme... al lío...
Tengo una BD, tabla 'datos' con los siguientes campos:
'id' auto_increment
'num' valor numérico que se puede repetir
'seccion' valor numérico. Para cada 'num' este campo toma valores 1,2 y 3.
'elemento1' valor numérico cualquiera para cada valor de 'seccion'
'elemento2' valor numérico cualquiera para cada valor de 'seccion'
'elemento3' valor numérico cualquiera para cada valor de 'seccion'

Mediante una consulta quiero mostrar para cada valor distinto de 'num' el subtotal correspondiente a cada 'sección" (suma de elemento1+elemento2+elemento3) y además el total correspondiente a la suma de las tres secciones (suma de los tres subtotales anteriores).
¿No sé si me he expresado bien? Por si acaso ejemplo:

num sección elemento1 elemento2 elemento3
1 1 20 18 7
1 2 15 6 9
1 3 10 5 5
2 1 2 22 3
2 2 10 7 2
2 3 1 11 10

Tendría que obtener
num seccion1 sección2 seccion3 total
1 45 30 20 95
2 27 19 22 68

No tengo claro si hacer varios select, o si en una sólo sentencia se puede solucionar? Estoy liada...
  #2 (permalink)  
Antiguo 09/06/2015, 08:06
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Obtener total y subtotales

que manejador de bases de datos usas?? y cual es el avance que llevas???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 09/06/2015, 08:20
 
Fecha de Ingreso: abril-2015
Mensajes: 45
Antigüedad: 9 años
Puntos: 0
Respuesta: Obtener total y subtotales

Estoy con mysql.
No sé si con una sola linea del select lo puedo resolver?
El total para cada num lo hago con un group by y nombro cada elemento como una suma para obtener luego el total de elementos para cada num?
Estoy un pokitin liada.
  #4 (permalink)  
Antiguo 09/06/2015, 08:41
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: Obtener total y subtotales

Postea la spruebas que hays hecho.
Partir de lo que haces es más simple paa ver qué es lo que te falta entender.
__________________
¿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 09/06/2015, 09:08
 
Fecha de Ingreso: abril-2015
Mensajes: 45
Antigüedad: 9 años
Puntos: 0
Respuesta: Obtener total y subtotales

Esto es lo que tengo para sacar los totales por 'num':

Código SQL:
Ver original
  1. SELECT *, (SUM(elemento1)+SUM(elemento2)+SUM(elemento3))total
  2. FROM datos WHERE elemento1>0 && elemento2>0 && elemento3>0
  3. GROUP BY num
  4. ORDER BY total

Esto me da los totales para cada num sumando las distintas secciones de cada num.

El WHERE elemento1>0 && elemento2>0 && elemento3>0 es para filtrar y descartar los 'num' que no tienen o les falta algún valor de elemento. En este WHERE... si pongo sum(elemento1)>0 me da error...¿por qué?

¿Cómo obtengo para cada 'num' el subtotal correspondiente a cada 'seccion'?

Última edición por gnzsoloyo; 09/06/2015 a las 09:22
  #6 (permalink)  
Antiguo 09/06/2015, 09:26
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: Obtener total y subtotales

Cita:
si pongo sum(elemento1)>0 me da error...¿por qué?
Porque SUM() es una función de agregación, y en todos los DBMS está estrictamente prohibido poner funciones de agregación en el WHERE.

El WHERE es un condicionante que se evalúa por cada uno de los registros considerado individualmente, es decir, filtra los registros que deben cumplir las condiciones indicadas. En cambio un SUM() es una función que para tener significado debe agrupar 1...N registros diferentes. Ambas cosas son funcionalmente incompatibles, ¿se entiende?

Ahora bien, si lo que deseas es que, de todos los registros que se obtienen agrupando, sólo devuelva los que cumplen con un valor de sumatoria dado, entonces debes usar HAVING

Código SQL:
Ver original
  1. SELECT *, (SUM(elemento1)+SUM(elemento2)+SUM(elemento3)) total
  2. FROM datos
  3. WHERE elemento1>0 && elemento2>0 && elemento3>0
  4. GROUP BY num
  5. ORDER BY total
  6. HAVING (SUM(elemento1)+SUM(elemento2)+SUM(elemento3))>0
__________________
¿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 09/06/2015, 09:34
 
Fecha de Ingreso: abril-2015
Mensajes: 45
Antigüedad: 9 años
Puntos: 0
Respuesta: Obtener total y subtotales

Entiendo. Y çomo hago para que la condición se cumpla que todos los elementos sean mayores que cero?
Con mi ejemplo solo consigo que se cumpla para los elementos de una sola seccion y no de las tres que puede tener cada num.
y con la que me das solo verifico que la suma de los totales de cada elemento sea mayor que cero.
resumiendo, quiero calcular los totales solo de los num donde se cumpla que todos los elementos de cada sección sean mayores que cero.
  #8 (permalink)  
Antiguo 09/06/2015, 09:51
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: Obtener total y subtotales

Pues lo haces de la forma más simple de todas.... el where debe considerar que cada uno de los campos debe ser mayor que cero...
No le busques vueltas, ni intentes atajos. No estás usando un lenguaje de programación, estás utilizando SQL, y el SQL es un lenguaje imperativo. Eso siginfica que paa que algo se haga, debes indicarlo expresamente. La base de datos no puede inferir ni adivinar.

¿Qué condiciones deben cumplir los regitros? ¿Los tres campos deben tener un valor mayor a cero,?

Bueno, entonces dilo:
Código SQL:
Ver original
  1. SELECT *, SUM(elemento1 + elemento2 + elemento3) total
  2. FROM datos
  3. WHERE elemento1>0 AND elemento2>0 AND elemento3>0
  4. GROUP BY num
  5. ORDER BY total;
... pero esto ya lo estabas haciendo.

¿Qué problema te trae?

Postea los datos que hay en la tabla, lo que te devuelve, y un ejemplo de lo que tu supones que debería devolver.
__________________
¿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 09/06/2015, 09:56
 
Fecha de Ingreso: abril-2015
Mensajes: 45
Antigüedad: 9 años
Puntos: 0
Respuesta: Obtener total y subtotales

El ejemplo de lo que se supone debe devolver li puse al principio.
Ya tengo la parte del total aprendida, muchas gracias.
Ahora me falta ¿como obtengo el subtotal de cada seccion?
¿tengo que hacer un nuevo select o puedo resolverlo de otra forma aprovechando el select actual?
Ninguna de las dos la tengo clara.
  #10 (permalink)  
Antiguo 09/06/2015, 09:59
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: Obtener total y subtotales

Cita:
num sección elemento1 elemento2 elemento3
1 1 20 18 7
1 2 15 6 9
1 3 10 5 5
2 1 2 22 3
2 2 10 7 2
2 3 1 11 10

Tendría que obtener
num seccion1 sección2 seccion3 total
1 45 30 20 95
2 27 19 22 68
Creo que voy entendiendo.
Esta sería la solución para MySQL, no es aplicable si usas otro DBMS:
Código SQL:
Ver original
  1. SELECT num,
  2.   SUM(IF(seccion = 1, (elemento1 + elemento2 + elemento3), 0) Seccion1,
  3.   SUM(IF(seccion = 2, (elemento1 + elemento2 + elemento3), 0) Seccion2,
  4.   SUM(IF(seccion = 3, (elemento1 + elemento2 + elemento3), 0) Seccion3,
  5.   SUM(elemento1 + elemento2 + elemento3) Total
  6. FROM datos
  7. WHERE elemento1>0 AND elemento2>0 AND elemento3>0
  8. GROUP BY num
  9. ORDER BY 5 DESC;
__________________
¿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 09/06/2015, 10:04
 
Fecha de Ingreso: abril-2015
Mensajes: 45
Antigüedad: 9 años
Puntos: 0
Respuesta: Obtener total y subtotales

Genial, tiene buena pinta, no se me habia ocurrido usar los if con el select.
¿por qué order by 5? De donde sale ese 5?
es por ser el quinto elemento del select y equivale a total?
No conocia esa notación, me pondré manos a la obra... mil gracias...

Última edición por gusiluz1977; 09/06/2015 a las 10:14
  #12 (permalink)  
Antiguo 09/06/2015, 10:22
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: Obtener total y subtotales

Manual de referencia: ORDER BY

__________________
¿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 09/06/2015, 11:05
 
Fecha de Ingreso: abril-2015
Mensajes: 45
Antigüedad: 9 años
Puntos: 0
Respuesta: Obtener total y subtotales

Muchísimas gracias gnzsoloyo, he aprendido unas cuantas cosas, aparte de haber resuelto el problema que tenía, algo más complejo que lo que puse aquí, que era sólo una síntesis y me ha sido de gran valía.
  #14 (permalink)  
Antiguo 09/06/2015, 12:01
 
Fecha de Ingreso: abril-2015
Mensajes: 45
Antigüedad: 9 años
Puntos: 0
Respuesta: Obtener total y subtotales

Una cuestión más, que me he puesto a hacer pruebas y me sigue dando problemas el WHERE, tengo lo siguiente:
Código SQL:
Ver original
  1. SELECT num,
  2.   SUM(IF(seccion = 1, (elemento1 + elemento2 + elemento3), 0) Seccion1,
  3.   SUM(IF(seccion = 2, (elemento1 + elemento2 + elemento3), 0) Seccion2,
  4.   SUM(IF(seccion = 3, (elemento1 + elemento2 + elemento3), 0) Seccion3,
  5.   SUM(elemento1 + elemento2 + elemento3) Total
  6. FROM datos
  7. WHERE elemento1>0 AND elemento2>0 AND elemento3>0
  8. GROUP BY num
  9. ORDER BY 5 DESC;

Si por ejemplo el num=1, sección=3, elemento3=0, al ser el elemento3=0, no debería aparecer el num=1 en la consulta, sin embargo aparece con el valor correspondiente de seccion1 y sección2 y en seccion3=0 y total=seccion1+seccion2, en lugar de directamente no aparecer como resultado el num=1.

Con num=1, sección=3, elemento3=0 la consulta me devuelve:
num seccion1 sección2 seccion3 total
1 45 30 0 75
2 27 19 22 68

En lugar de devolverme
num seccion1 sección2 seccion3 total
2 27 19 22 68

Última edición por gnzsoloyo; 09/06/2015 a las 12:27
  #15 (permalink)  
Antiguo 09/06/2015, 12:31
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: Obtener total y subtotales

Empecemos por el principio: ¿Cuál es la estructura de esa tabla?

Muestrame el resultado de esto:
Código MySQL:
Ver original 

Porque lo que dices no tiene sentido. Los AND son mandatorios, y una condición de este tipo:
Código MySQL:
Ver original
  1. ...
  2. WHERE elemento1 > 0 AND elemento2 > 0 AND elemento3 > 0
sólo devuelve aquellos registros donde en los tres campos hay valores superiores a cero.
__________________
¿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 09/06/2015, 13:42
 
Fecha de Ingreso: abril-2015
Mensajes: 45
Antigüedad: 9 años
Puntos: 0
Respuesta: Obtener total y subtotales

No tendrá algo que ver el group by?
Mañana pongo la estructura que ya he salido del job y no vuelvo hasta mañana.
  #17 (permalink)  
Antiguo 09/06/2015, 13:50
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: Obtener total y subtotales

No, El GROUP BY sólo puede agrupar lo que ya se obtuvo, y el WHERE no debería devolver NINGÚN registro donde haya cero en al menos uno de esos campos.
__________________
¿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 10/06/2015, 00:53
 
Fecha de Ingreso: abril-2015
Mensajes: 45
Antigüedad: 9 años
Puntos: 0
Respuesta: Obtener total y subtotales

Esto es lo que me devuelve con el show:
Código MySQL:
Ver original
  1. CREATE TABLE `datos` (
  2.   `num` int(3) NOT NULL,
  3.   `seccion` int(1) NOT NULL,
  4.   `elemento1` int(6) NOT NULL,
  5.   `elemento2` int(6) NOT NULL,
  6.   `elemento3` int(6) NOT NULL,
  7.   PRIMARY KEY  (`id`)

Haciendo pruebas me he dado cuenta que el WHERE discrimina fila por fila, de ahí que en la fila (registro) donde encuentra un cero la elimina, pero no el resto de filas (registros) que corresponden al mismo 'num', que se repite. De ahí que a los efectos no discrimine el 'num' completo sino sólo la 'seccion' (registro) donde encuentra el cero. ¿Tendrá algo que ver? Tener en cuenta que un mismo 'num' (por ejemplo el num=1) tiene tres 'id' distintos, uno para cada sección (num=1, seccion=1 --->id=1 ; num=1, seccion=2 --->id=2 ; num=1, seccion=3 --->id=3).

Resumiendo, en el RESULTADO sólo pueden listarse los 'num' que han cubierto todas las secciones, y para ello se considera que cada 'seccion' está cubierta si cada uno de sus elementos es mayor que cero.

Última edición por gnzsoloyo; 11/06/2015 a las 10:01
  #19 (permalink)  
Antiguo 11/06/2015, 09:29
 
Fecha de Ingreso: abril-2015
Mensajes: 45
Antigüedad: 9 años
Puntos: 0
Respuesta: Obtener total y subtotales

SOLUCIONADO este último escollo, muchas gracias gnzsoloyo.

Etiquetas: select, subtotales, tabla
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 11:22.