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

buscar sobre el resultado de un sum

Estas en el tema de buscar sobre el resultado de un sum en el foro de Mysql en Foros del Web. Hola tengo una tabla con los siguientes registros @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código HTML: Ver original num_factura       subtotal 123           ...
  #1 (permalink)  
Antiguo 22/01/2010, 07:39
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 3 meses
Puntos: 4
buscar sobre el resultado de un sum

Hola

tengo una tabla con los siguientes registros

Código HTML:
Ver original
  1. num_factura       subtotal
  2. 123                    100.000
  3. 123                        5.000
  4. 456                        1.000
  5. 456                      10.000
  6. 889                        4.000

mi consulta seria asi.

Código MySQL:
Ver original
  1. SELECT sum(valor_total) as subtotal
  2. FROM pedidos
  3. WHERE subtotal = 105000
  4. group by num_factura
  5. ORDER BY fecha_factura ASC


en este caso me deberia retornar la agrupacion de las facturas 123
con su suma 105.000

como veran estoy usando no el nombre real del campo que en este caso seria valor_total sino el alias es decir el resultado de la sumatoria en este caso subtotal


pero no me funciona. cual es la forma correcta para hacerlo?

no me funciona ni para el select sum, ni para el select count(*)
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #2 (permalink)  
Antiguo 22/01/2010, 08:03
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: buscar sobre el resultado de un sum

Para eso debes usar HAVING:
Código MySQL:
Ver original
  1.     SUM(valor_total) as subtotal
  2.     pedidos
  3.     num_factura
  4.     subtotal = 105000
  5.     fecha_factura ASC
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 22/01/2010, 08:27
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: buscar sobre el resultado de un sum

ok muchas gracias,.. lo revisare y te comento
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #4 (permalink)  
Antiguo 22/01/2010, 09:28
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: buscar sobre el resultado de un sum

como seria la forma correcta para hacer un
select count sobre esa consulta?

Código MySQL:
Ver original
  1. SELECT SUM(valor_total) as subtotal
  2. FROM pedidos
  3. GROUP BY num_factura
  4. HAVING subtotal = 105000
  5. ORDER BY fecha_factura ASC


ya que
el num_factura se repite varias veces para cada factura.


yo lo tenia asi antes de lo del having

Código MySQL:
Ver original
  1. SELECT COUNT(distinct(num_factura)) as total
  2. FROM pedidos

no le podia poner el group by num_factura porque no me daban los registros

entonces no se que estare haceindo mal.
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com

Última edición por lexus; 22/01/2010 a las 09:48
  #5 (permalink)  
Antiguo 22/01/2010, 09:57
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: buscar sobre el resultado de un sum

si te entendí bien, esto te puede servir.

Código SQL:
Ver original
  1. SELECT num_factura,SUM(valor_total) AS subtotal,
  2. (SELECT COUNT(DISTINCT(num_factura)) FROM pedidos) conteo
  3. FROM pedidos
  4. GROUP BY num_factura
  5. HAVING subtotal = 105000
  6. ORDER BY num_factura ASC
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 22/01/2010, 09:59
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: buscar sobre el resultado de un sum

hay alguna forma de hcer el count por separado?


es qeu el select lo uso para mostrar los datos

y el select count lo uso en otra parte para hacer una paginacion. tonces no podria tenerlos juntos..
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #7 (permalink)  
Antiguo 22/01/2010, 10:02
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: buscar sobre el resultado de un sum

Lexus no entiendo.

Si los quieres separados, simplemente haces las consultas por separado.

Pon un ejemplo de lo que quieres.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 22/01/2010, 10:05
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: buscar sobre el resultado de un sum

algo asi es lo que quiero

pero en este caso por usar el distinct no funciona el group by
nose si con este ejemplo sea claro

Código &quot:
Ver original
  1. SELECT
  2. count(distinct(num_factura))
  3. FROM pedidos
  4. GROUP BY num_factura
  5. HAVING sum(valor_total) = 105000
  6. ORDER BY fecha_factura ASC
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #9 (permalink)  
Antiguo 22/01/2010, 12:00
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: buscar sobre el resultado de un sum

Lexus, esto no tiene demasiado sentido:

Código SQL:
Ver original
  1. SELECT
  2. COUNT(DISTINCT(num_factura))
  3. FROM pedidos
  4. GROUP BY num_factura
  5. HAVING SUM(valor_total) = 105000
  6. ORDER BY fecha_factura ASC
Agrupas por num_factura y cuentas distintos num_factura: pues te debería salir siempre 1. Si quitas el distinct, te saldrá la cuenta num_factura cuya suma es 105000, es decir, si hay 2 registros con num_factura 123 que sumen esa cantidad, te saldrá 2. Deberías explicarnos sobre tus datos qué quieres que salga.
  #10 (permalink)  
Antiguo 22/01/2010, 12:48
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: buscar sobre el resultado de un sum

es que tengo esto


Código HTML:
num_factura       subtotal
123                      100.000
123                      5.000
456                      1.000
456                      10.000
889                       4.000


el numero de factura se puede repetir varias veces poque
son productos en cada factura

entonces en el conteo de

Código HTML:
123
123
123
456
456
889
debe quedar asi
numero de facturas = 3
ya que agrupamos la 123, 456, y 889
pero ademas de necesitar el conteo de esa cantidad de factura

por aparte
necesito el valor de la suma de cada factura
este valor ya me funciona con lo que me dijiste
ahora solo me falta el conteo que no he logrado hacerlo funcionar.
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com

Última edición por lexus; 22/01/2010 a las 12:54
  #11 (permalink)  
Antiguo 22/01/2010, 13:03
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: buscar sobre el resultado de un sum

Prueba esto

Código SQL:
Ver original
  1. SELECT p.num_factura,SUM(p.valor_total) AS subtotal,t1.conteo
  2. FROM pedidos p INNER JOIN
  3. (SELECT num_factura,COUNT(*) conteo FROM pedidos GROUP BY num_factura) t1
  4. ON p.num_factura = t1.num_factura
  5. GROUP BY p.num_factura
  6. HAVING subtotal = 105000
  7. ORDER BY p.num_factura ASC

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #12 (permalink)  
Antiguo 22/01/2010, 13: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: buscar sobre el resultado de un sum

Per lo que se entiende, lexus, quieres saber cuántas veces aparece cada número de factura en la tabla PEDIDOS, y al mismo tiempo el importe total de cada una de ellas.
Si eso es así, la consulta debería poder hacerse al mismo tiempo. SI lo que quieres es saber cuántas facturas distintas tienes en PEDIDOS, se vueve un poco incompatible, porque estás pidiendo datos con agrupaciones diferentes.
Lo tuyo parece un reporte de tipo OLAP, por lo que tal vez esto sea lo que andas buscando:
Código MySQL:
Ver original
  1.   IF(NUM_FACTURA IS NULL ,'CANT. DE FACTURAS', IF(TOTAL IS NULL, '', NUM_FACTURA)) N_FACTURA,
  2.   IFNULL(TOTAL,'') IMPORTE_TOTAL,
  3.   IF(TOTAL IS NULL, COUNT(*), '') TOTALFACTURAS
  4.   SELECT NUM_FACTURA, SUM(SUBTOTAL) TOTAL, COUNT(DISTINCT NUM_FACTURA) FACT
  5.   FROM pedidos
  6.   GROUP BY NUM_FACTURA)A
  7. GROUP BY NUM_FACTURA, TOTAL WITH ROLLUP ;

El resultado sería:
Código MySQL:
Ver original
  1. +-------------------+---------------+---------------+
  2. | N_FACTURA         | IMPORTE_TOTAL | TOTALFACTURAS |
  3. +-------------------+---------------+---------------+
  4. | 123               | 105000.00     |               |
  5. |                   |               | 1             |
  6. | 456               | 11000.00      |               |
  7. |                   |               | 1             |
  8. | 889               | 4000.00       |               |
  9. |                   |               | 1             |
  10. | CANT. DE FACTURAS |               | 3             |
  11. +-------------------+---------------+---------------+
  12. 7 rows in set (0.00 sec)
para evitar las líneas que contienen 1 como total facturas, deberíamos transformar tod ala cosnutla en una subconsulta, y eliminar la info inservible.
Código MySQL:
Ver original
  1.   (SELECT
  2.     IF(NUM_FACTURA IS NULL ,'CANT. DE FACTURAS', IF(TOTAL IS NULL, '', NUM_FACTURA)) N_FACTURA,
  3.     IFNULL(TOTAL,'') IMPORTE_TOTAL,
  4.     IF(TOTAL IS NULL, COUNT(*), '') TOTALFACTURAS
  5.   FROM (
  6.     SELECT NUM_FACTURA, SUM(SUBTOTAL) TOTAL, COUNT(DISTINCT NUM_FACTURA) FACT
  7.     FROM pedidos
  8.     GROUP BY NUM_FACTURA)A
  9.   GROUP BY NUM_FACTURA, TOTAL WITH ROLLUP) B
  10.  WHERE N_FACTURA<>'';

Lo que daría:
Código MySQL:
Ver original
  1. +-------------------+---------------+---------------+
  2. | N_FACTURA         | IMPORTE_TOTAL | TOTALFACTURAS |
  3. +-------------------+---------------+---------------+
  4. | 123               | 105000.00     |               |
  5. | 456               | 11000.00      |               |
  6. | 889               | 4000.00       |               |
  7. | CANT. DE FACTURAS |               | 3             |
  8. +-------------------+---------------+---------------+
  9. 4 rows in set (0.00 sec)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 22/01/2010 a las 13:57
  #13 (permalink)  
Antiguo 23/01/2010, 10:58
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: buscar sobre el resultado de un sum

la verdad me confundi un poco con tanto codigo
intente probar el ultimo que me paso huesos52 pero me retorno vacio..

voy a tratar de resumir un poco a ver si me entiennden. es qeu creo que no me estoy explicando bien..

la consulta que me paso huesos es decir esta

SELECT SUM(valor_total) as subtotal
FROM pedidos GROUP BY num_factura
HAVING subtotal = 105000
ORDER BY fecha_factura ASC

funciona perfecto


ahora quiero hacer otra consulta por separado

que me cuente cuantos registros retorna esa consulta.
pero nada mas necesito saber cuantos registros no necesito saber ni la suma ni el numero de la factura.
solo la cantidad de registros que al sumarlos dieron 105000


nose si lo explique mejor o lo complique mas..
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #14 (permalink)  
Antiguo 23/01/2010, 11:27
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: buscar sobre el resultado de un sum

Cita:
Iniciado por lexus Ver Mensaje
la verdad me confundi un poco con tanto codigo
intente probar el ultimo que me paso huesos52 pero me retorno vacio..

voy a tratar de resumir un poco a ver si me entiennden. es qeu creo que no me estoy explicando bien..

la consulta que me paso huesos es decir esta

SELECT SUM(valor_total) as subtotal
FROM pedidos GROUP BY num_factura
HAVING subtotal = 105000
ORDER BY fecha_factura ASC

funciona perfecto


ahora quiero hacer otra consulta por separado

que me cuente cuantos registros retorna esa consulta.
pero nada mas necesito saber cuantos registros no necesito saber ni la suma ni el numero de la factura.
solo la cantidad de registros que al sumarlos dieron 105000


nose si lo explique mejor o lo complique mas..
ok lexus...

si has sido claro, no bastaría con cambiarle a la consulta el sum por el count?

Código SQL:
Ver original
  1. SELECT COUNT(valor_total) AS subtotal
  2. FROM pedidos GROUP BY num_factura
  3. HAVING subtotal = 105000
  4. ORDER BY fecha_factura ASC
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #15 (permalink)  
Antiguo 24/01/2010, 14:48
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: buscar sobre el resultado de un sum

hola
la verdad sigue sin funcionarme

te pongo un ejemplo de como me funcionaba antes de usar el having par una consulta mas facil...



par seleccionar y mostrar los datos hago asi

Código MySQL:
Ver original
  1. SELECT sum(valor_total) as subtotal
  2. from pedidos
  3. group by num_factura
  4. ORDER BY fecha_factura ASC, num_factura ASC;



y para contar hacia asi

Código MySQL:
Ver original
  1. SELECT count(distinct(num_factura))
  2. from pedidos
  3. limit 0,1;


porque si lo hago asi no me funciona como debe ser

Código MySQL:
Ver original
  1. SELECT  count(*) as total
  2. from pedidos
  3. group by num_factura
  4. limit 0,1;
ya que mis facturas son
tienen por cada item el numero de la factura y el valor del producto

entonces me toca hacer el distinct para ke solo me cuente una vez cada faactura con el mismo numero
asi hayan 5 factuars con el mismo numero me la cuenta una sola vez.


asi me funcionaba pero el cliente me pidio el requerimiento nuevo del subtotal con HAVING y ahi ya fue que se me complico.
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #16 (permalink)  
Antiguo 24/01/2010, 15: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: buscar sobre el resultado de un sum

O sea, quieres que te cuente todas las facturas cuyo importe sumado sea igual a un importe dado... No entiendo para qué quiere saber eso tu cliente, pero hay dos formas de obtener lo que quieres:
Código MySQL:
Ver original
  1. SELECT COUNT(DISTINTC num_factural) CantFacturas
  2. FROM pedidos
  3. GROUP BY num_factura
  4. HAVING subtotal = 105000;
O bien

Código MySQL:
Ver original
  1. SELECT COUNT(DISTINTC num_factura) CantFacturas
  2.    (SELECT
  3.        num_factura,
  4.        SUM(valor_total) Total
  5.     FROM pedidos
  6.     GROUP BY num_factura) T1
  7. WHERE Total = 105000;

Cualquier otra opción puede ser obtenida a través de variaciones de estos modelos.

En cualquier caso, existe la posibilidad de que esta consulta te devuelva cero, uno o más de uno.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #17 (permalink)  
Antiguo 24/01/2010, 16:18
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: buscar sobre el resultado de un sum

gracias..
en la primer consulta qeu me escribiste no hace el having del subtotal ya qeu no hay la suma

sum(valor_total) as subtotal

y en la segunda consutla me retorna muchos resultados
yu deberia retornar solo 1 registro con el total de las facturas.
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #18 (permalink)  
Antiguo 24/01/2010, 16: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: buscar sobre el resultado de un sum

Cita:
en la primer consulta qeu me escribiste no hace el having del subtotal ya qeu no hay la suma
Entonces complétala con lo que debe tener... No requiere demasiado:
Código MySQL:
Ver original
  1. SELECT COUNT(DISTINTC num_factural) CantFacturas
  2. FROM pedidos
  3. GROUP BY num_factura
  4. HAVING SUM(valor_total) = 105000;

Cita:
y en la segunda consutla me retorna muchos resultados
yu deberia retornar solo 1 registro con el total de las facturas.
No. No necesariamente te debería devolver un sólo registro, porque para eso deberías tener un mejor discriminante, y estás haciendo la discriminación por el importe de la factura, lo que puede dar lugar, en un sistema de facturación a que haya cero, una o mas facturas que tengan el mismo importe dado, pasado como parámetro...
Eso ya te lo dije en el post.

Desglosemos la consulta.
Esto:
Código MySQL:
Ver original
  1.        num_factura,
  2.        SUM(valor_total) Total
  3.     FROM pedidos
  4.     GROUP BY num_factura
devuelve la lista completa de facturas por número, con el importe total de cada una (según dijiste, valor_total contiene los valores parciales de cada ítem).

Esto otro:
Código MySQL:
Ver original
  1. SELECT COUNT(DISTINTC num_factura) CantFacturas
  2.    (
  3.     ....
  4.    ) T1
  5. WHERE Total = 105000;
toma el resultado de la anterior, y te devuelve solamente aquellas en que el importe sumado sea igual a 105000... Si te devuelve más de una, es porque hay más de una factura que da ese importe.

AL menos esa es la idea de la consulta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #19 (permalink)  
Antiguo 24/01/2010, 16:47
Avatar de lexus  
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: buscar sobre el resultado de un sum

no entonces voy a plantear denuevo el problema

porque al parecer no esta claro aun

debe retornar 1 solo registro cuando hago el count porque debe decir
Total facturas: 5000


cuando las muestro con mi select ahi me debe mostrar las 5000 factuars que tienen un subtotal especificado.
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com
  #20 (permalink)  
Antiguo 24/01/2010, 16: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: 16 años, 4 meses
Puntos: 2658
Respuesta: buscar sobre el resultado de un sum

La última consulta que te pasé, a mí en las pruebas me devuelve un sólo registro...
Cita:
me debe mostrar las 5000 factuars que tienen un subtotal especificado.
Para que te las muestr a las facturas, debes poner el campo necesario en un agrupamiento, y para que te haga la cuenta final, de todas, debes usar WITH ROLLUP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: sum, resultados
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 16:39.