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

Sumar o restar campos generados

Estas en el tema de Sumar o restar campos generados en el foro de Mysql en Foros del Web. Buenas gente, estoy haciendo una query y me tope con este problema: Tengo una tabla de productos, una de ordenes y una de pagos. La ...
  #1 (permalink)  
Antiguo 27/11/2009, 01:46
 
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 29
Antigüedad: 16 años, 7 meses
Puntos: 0
Sumar o restar campos generados

Buenas gente, estoy haciendo una query y me tope con este problema:

Tengo una tabla de productos, una de ordenes y una de pagos.

La relacion es 1 orden -> varios productos, con varios pagos (mini pagos) POR ORDEN.

Código sql:
Ver original
  1. SELECT ordenes.id
  2.      , ( SUM( productos.valor ) - productos.iva_total ) AS total
  3.      , ( SELECT SUM( pagos.importe_total ) FROM pagos WHERE ordenes_id = ordenes.id GROUP BY ordenes_id ) AS pagado
  4.   FROM ordenes
  5. INNER JOIN productos,, con su tabla "ordenes_productos", etc
  6. GROUP BY ordenes.id

Esta query es parte de un listado, y como se le aplican filtros que modifican el SQL dinamicamente, necesito tener que hacer esto por SQL si o si..

Entonces:
Como poria obtener el resultado de total - pagado? para hacer una condicion por ejemlo

Código sql:
Ver original
  1. WHERE ( total - pagado ) > 0 #Que traiga solo las ordenes que tienen saldo pendiente

Intente haciendo la cuenta ahi mismo, asi:
Código sql:
Ver original
  1. (( SUM( productos.valor ) - productos.iva_total ) - ( SELECT SUM( pagos.importe_total ) FROM pagos WHERE ordenes_id = ordenes.id GROUP BY ordenes_id )) AS diferencia

Pero me trae el campo null, por lo que deduzco que no es capaz de hacer esa operacion..

Ya intente todo lo que se me ocurrio pero nada funciono jaja..
alguna idea ??

Saludos
  #2 (permalink)  
Antiguo 27/11/2009, 03:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Sumar o restar campos generados

Primero de todo creo que te falta una tabla, deberias tener

ordenes
idOrden
fecha
...
//Cabecera de la orden, datos generales, fecha cliente... etc



DetalleOrden
idDetalle
idOrden
idProducto
cantidad
precio
IVA


//Lineas de la orden producto cantidad y precio aplicado

Productos
idProducto
Nombre
Precio
IVA%

//Catalogo de productos con el nombre y el precio actual



Pagos

idPago
idOrden
Fecha
importe

//Pagos, identificador de la orden a la que corresponde, fecha y importe

Con esa estructura podriamos funcionar.

Sobre lo que nos pasas NO entiendo esta operación

Código sql:
Ver original
  1. ...
  2. ( SUM( productos.valor ) - productos.iva_total ) AS total
  3. ...

si el campo iva_total esta en productos luego deberia ser

Código sql:
Ver original
  1. ...
  2.  SUM( productos.valor - productos.iva_total ) AS total
  3. ...

Si tienes el IVA includo en valor, luego no tines que sacarlo para comparar con pagos puesto que los pagos seran tambien con iva incluido... no?

Luego para ver la ordenes con saldo pendiente, divide y venceras...


Código sql:
Ver original
  1. SELECT ordenes_id, SUM(pagos.importe_total)
  2. FROM pagos
  3. GROUP BY ordenes_id

Esto nos da lo pagado de cada orden...

Código sql:
Ver original
  1. SELECT productos.ordenes_id,
  2.          SUM( productos.valor - productos.iva_total ) AS totalSinIva,
  3.          SUM( productos.valor ) AS totalConIva
  4. FROM productos
  5. GROUP BY productos.ordenes_id

Esto nos da el total de la orden (con o sin IVA, tu sabras)

Ahora solo falta mezclarlas...



Código SQL:
Ver original
  1. SELECT ValorOrden.Orden,
  2.             (ValorOrden.totalConIva-IFNULL(PagosOrden.Pagado,0)) AS Pendiente
  3. FROM (SELECT productos.ordenes_id AS Orden,
  4.                   SUM( productos.valor - productos.iva_total ) AS totalSinIva,
  5.                   SUM( productos.valor ) AS totalConIva
  6.                FROM productos
  7.                GROUP BY productos.ordenes_id) AS ValorOrden
  8.            LEFT JOIN
  9.                 (SELECT ordenes_id AS Orden, SUM(pagos.importe_total) AS Pagado
  10.                   FROM pagos
  11.                 GROUP BY ordenes_id) AS PagosOrden
  12.            ON ValorOrden.Orden=PagosOrden.Orden
  13. WHERE (ValorOrden.totalConIva-IFNULL(PagosOrden.Pagado,0))>0;


No lo he probado pero seria lago así.

Quim
  #3 (permalink)  
Antiguo 27/11/2009, 05:42
 
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 29
Antigüedad: 16 años, 7 meses
Puntos: 0
Respuesta: Sumar o restar campos generados

Hola Quim, antes que nada muchas gracias por tu respuesta y tu tiempo.

Si bien el modelo de productos y ordenes lo puse de ejemplo para que se entendiese el problema, es mas complejo que eso.

en realidad no tengo productos, ni ordenes, sino caballos, embarques, liquidaciones, y alguans tablas mas relacionadas..

Gracias a tu ejemplo, entendi como hacer los Selects adentro de un LEFT, porque antes los hacia mal, y no me dejaba relacionar las tablas cuando hacia LEFT JOIN ( Select.. where id = TABLADEAFUERA.id ).. me decia que no existia TABLADEAFUERA, y tenia razon..

En fin, me volvi un poco loco pero lo pude resolver, Tenia que se de esta forma, porque usa la misma query (simplificada) para hacer la paginacion..

En un punto usando el select adentro del LEFT, pero para el otro ya era mucho quilombo porque esta todo agrupado, pero pude usar Having, la query quedo asi:

Código sql:
Ver original
  1. SELECT l.id
  2.        , cl.razon_social AS cliente_liquidador
  3.        , l.embarque_id
  4.        , Date_Format( e.fecha_salida, '%d/%m/%Y' ) AS fecha_salida
  5.        , p.nombre AS destino
  6.        , COUNT( c.id ) AS cantidad_caballos
  7.        , Group_Concat( DISTINCT r.nombre ORDER BY r.nombre Separator ', '  ) AS razas
  8.        , SUM( c.valor ) AS valor_caballos
  9.        , ( SUM( c.valor ) - ( ( SUM( c.valor ) * 9.0909 ) / 100 ) - l.gastos_total - l.iva_total ) AS total
  10.        , pagos.pagado
  11.        , ( ( SUM( c.valor ) - ( ( SUM( c.valor ) * 9.0909 ) / 100 ) - l.gastos_total - l.iva_total ) - pagos.pagado ) AS saldo
  12.       FROM liquidaciones l
  13. INNER JOIN embarques e
  14.         ON e.id = l.embarque_id
  15. INNER JOIN clientes cl
  16.         ON cl.id = l.cliente_liquidador_id
  17. INNER JOIN paises p
  18.         ON p.id = e.destino_aereo_id
  19.  LEFT JOIN ( SELECT ( SUM( importe_total ) - SUM( retencion_ganancia ) ) AS pagado, liquidacion_id FROM liquidaciones_pagos GROUP BY liquidacion_id ) AS pagos
  20.         ON pagos.liquidacion_id = l.id
  21.  LEFT JOIN liquidaciones_caballos lc
  22.         ON lc.liquidador_id = l.id
  23.  LEFT JOIN caballos c
  24.         ON c.id = lc.caballo_id
  25.  LEFT JOIN razas r
  26.         ON r.id = c.raza_id
  27.   GROUP BY l.id
  28.     HAVING saldo > 0 # Con saldo pendiente
  29.   # HAVING ( IsNull( saldo ) OR saldo <= 0 ) - Sin saldo pendiente

No me gusta mucho que se repita el ( Sum( c.valor ) - ( ( Sum( c.valor )... pero buen, ya fue xD

Ah, ahora que veo bien me parece que el Having me hubiese servido desde el primer momento,, lol

Saludos
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 01:14.