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

resta de 2 campos

Estas en el tema de resta de 2 campos en el foro de Bases de Datos General en Foros del Web. Hola a todos; Quiero restar 2 campos que estan en diferentes tablas y os pongo el codigo. Código PHP: SELECT SUM ( apuntados . cantidad )- ...
  #1 (permalink)  
Antiguo 16/08/2009, 21:06
 
Fecha de Ingreso: febrero-2008
Mensajes: 675
Antigüedad: 16 años, 9 meses
Puntos: 5
resta de 2 campos

Hola a todos;
Quiero restar 2 campos que estan en diferentes tablas y os pongo el codigo.
Código PHP:
SELECT SUM(apuntados.cantidad)-SUM(productos.cantidad), apuntados.id_productoapuntados.vendedorapuntados.eliminadoproductos.id_productoproductos.cantidad
FROM apuntados
productos
WHERE apuntados
.id_producto=productos.id_producto AND apuntados.vendedor colname AND apuntados.eliminado='no'
GROUP BY apuntados.id_producto 
Pero seguramente el SUM esta mal colocado, pero no encuentro informacion sobre como hacer esta resta.

Un saludo
  #2 (permalink)  
Antiguo 17/08/2009, 18:52
 
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 15 años, 3 meses
Puntos: 10
Respuesta: resta de 2 campos

No se mucho de SQL pero te diria que estas "restando las sumas" y no campo a campo.

No debes usar SUM() para ello.
  #3 (permalink)  
Antiguo 17/08/2009, 20:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: resta de 2 campos

En realidad no se entiende bien la lógica de lo que quieres obtener.
¿Estás tratando de saber cuántas unidades de cada producto vendió un vendedor o qué otra cosa?
Tratas de saber si la cantidad én "apuntado" supera la cantidad de productos en stock?
¿Por qué participa la tabla producto en esta consulta?

Detalla un poco qué info guarda cada tabla y qué info es la que quieres que devuelva.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 18/08/2009, 03:32
 
Fecha de Ingreso: febrero-2008
Mensajes: 675
Antigüedad: 16 años, 9 meses
Puntos: 5
Respuesta: resta de 2 campos

En la tabla "apuntados" se insertan productos, en esta tabla pueden haber muchas lineas con el mismo producto, el ID del producto se coje de la tabla "productos" por eso esta incluida.
Lo que quiero hacer es lo siguiente.
En la tabla productos se inserta un articulo con un ID_productos (unico) y un campo que es la cantidad de ese producto.
En la tabla "apuntados" pueden haber muchos articulos con el mismo ID_prosuctos en el cual se inserta en un campo "cantidad" una cifra.
Quiero que me sume el campo "cantidad" con los mismo ID_productos de la tabla "apuntados" y me reste el total a la tabla "productos" y el total me lo muestre.



Cita:
Iniciado por gnzsoloyo Ver Mensaje
En realidad no se entiende bien la lógica de lo que quieres obtener.
¿Estás tratando de saber cuántas unidades de cada producto vendió un vendedor o qué otra cosa?
Tratas de saber si la cantidad én "apuntado" supera la cantidad de productos en stock?
¿Por qué participa la tabla producto en esta consulta?

Detalla un poco qué info guarda cada tabla y qué info es la que quieres que devuelva.
  #5 (permalink)  
Antiguo 18/08/2009, 05:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: resta de 2 campos

Más o menos así:
Código sql:
Ver original
  1. SELECT
  2.    p.id_producto,
  3.    (p.cantidad - t.total_apuntados) saldo_productos,
  4.    t.eliminado,
  5.    t.vendedor
  6. FROM productos p INNER JOIN
  7.    (SELECT
  8.       SUM(cantidad) total_apuntados,
  9.       id_producto,
  10.       vendedor,
  11.       eliminado
  12.    FROM apuntados,
  13.    WHERE
  14.       vendedor = colname
  15.       AND apuntados.eliminado='no'
  16.    GROUP BY id_producto) T  USING(id_producto)
  17. ORDER BY id_producto;
La lógica a aplicar es al revés. Si los registros que sí o si se deben usar están en productos es esa la tabla que debes usar como pivote, y a esa le debes restar el resultado ya sumado y filtrado de la otra. No es conveniente hacer eso fuera de una subconsulta porque obligarías al MySQL a realizar primero el JOIN a todos los registros, para luego sumar los que cumplen la condición. Eso implicaría crear una tabla temporal innecesariamente grande, ya que no todos los registros cruzados se usarán en el resultado final, cosa que si pasa con este modelo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 19/08/2009, 06:47
 
Fecha de Ingreso: febrero-2008
Mensajes: 675
Antigüedad: 16 años, 9 meses
Puntos: 5
Respuesta: resta de 2 campos

No la tabla que quiero usar es la de apuntados. lo que pasa es que la tabla productos es la que lleva el campo donde inicialmente se introduce la cantidad de articulos. Luego la tabla apuntados es la que se insertan filas con ese producto al cual hay que descontar.
  #7 (permalink)  
Antiguo 19/08/2009, 08: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: 17 años
Puntos: 2658
Respuesta: resta de 2 campos

Cita:
Iniciado por visona Ver Mensaje
No la tabla que quiero usar es la de apuntados. lo que pasa es que la tabla productos es la que lleva el campo donde inicialmente se introduce la cantidad de articulos. Luego la tabla apuntados es la que se insertan filas con ese producto al cual hay que descontar.
Tienes que usar ambas, el qué datos devuelvas es problema de cómo se redacte el conjunto selección. No confundas lógica de resolución con resultados.
Para lo que tu necesitas primero debes obtener la suma a restar (es la subconsulta) y sobre ella hacer la resta.

¿Probaste la idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 19/08/2009, 11:58
 
Fecha de Ingreso: febrero-2008
Mensajes: 675
Antigüedad: 16 años, 9 meses
Puntos: 5
Respuesta: resta de 2 campos

pues me quedo igual, jejejeje. he insertado tu consulta a ver que me sale y me da error.
Tampoco entiendo la forma en la que describes las tablas, yo suelo usar el nombre completo para no liarme.
t.total_apuntados) saldo_productos, estos campos que pones, yo no los tengo, asi que he de suponer que son ficticios, tampoco la tabla "t" tambien supongo que la pones para dar el ejemplo.
Si pudieras me harias un gran favor y asi lo entenderia, el favor seria que me explicaras linea a linea por que pones esos campos. Asi me haria una idea y podria darme una idea de como hacer la consulta.
Gracias por todo.
  #9 (permalink)  
Antiguo 19/08/2009, 12:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: resta de 2 campos

Por una cuestión de simplicidad de código, en lugar de poner nombres completos y arriesgarse a constantes errores de sintaxis, en SQL se usan ALIAS de las tablas usadas. Los alias se declaran poniendo un nombre adyacente ala denominación de la misma (tablas, bases o campos) o usando la cláusula AS (un poco obsoleta, ya no es mandatoria):

Código sql:
Ver original
  1. SELECT t.Campo1 AS a
  2. FROM Tabla2 AS t;
Código sql:
Ver original
  1. SELECT t.Campo1 a
  2. FROM Tabla2 t;

Estas dos dan el mismo resultado.

En cuanto al error, sería mejor que dijeras qué error te sale... como es tu base y tus datos, no se si el problema es de sintaxis o de datos, a menos que me lo digas.

Yendo a la lógica de lo hecho, la idea es:
Código sql:
Ver original
  1. SELECT
  2.       SUM(cantidad) total_apuntados,
  3.       id_producto,
  4.       vendedor,
  5.       eliminado
  6.    FROM apuntados,
  7.    WHERE
  8.       vendedor = colname
  9.       AND apuntados.eliminado='no'
  10.    GROUP BY id_producto
Esto debería devolver un listado de productos vendidos por el vendedor cuyo ID esté en la variable "colname" (tu tienes que poner ese valor, obviamente), sumando la cantidad en una columna que se llamará "total_apuntados", la cual contendrá también el id_producto y se agruparán por él.
Esto:
Código sql:
Ver original
  1. SELECT
  2.    p.id_producto,
  3.    (p.cantidad - t.total_apuntados) saldo_productos,
  4.    t.eliminado,
  5.    t.vendedor
  6. FROM productos p INNER JOIN
  7.    () T  USING(id_producto)
  8. ORDER BY id_producto;
Tomará la tabla productos y devolverá un listado de todos los productos que figuren en la subconsulta, entregando en la columna denominada "saldo_productos" la resta de la existencia menos lo vendido. Como la subconsulta genera una tabla derivada (una tabla en memoria), debe llevar un alias. De allí la "T" después de los paréntesis.
No sirve hacer un JOIN simple entre las dos tablas, porque entonces el proceso cruzará todos los datos antes de sumar los registros que únicamente pertenezcan a ese vendedor, lo cual es ineficiente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 23:00.