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

Como condicionar SUM en procedimiento almacenado

Estas en el tema de Como condicionar SUM en procedimiento almacenado en el foro de Bases de Datos General en Foros del Web. Buenas tardes, soy nueva por aquí, y agradesco de antemano por la ayuda que podrían ofrecerme :).. El problema es el siguiente, debo hacer un ...
  #1 (permalink)  
Antiguo 24/02/2012, 13:04
 
Fecha de Ingreso: febrero-2012
Mensajes: 4
Antigüedad: 12 años, 8 meses
Puntos: 0
Pregunta Como condicionar SUM en procedimiento almacenado

Buenas tardes, soy nueva por aquí, y agradesco de antemano por la ayuda que podrían ofrecerme :)..

El problema es el siguiente, debo hacer un procedimiento almacenado, donde:

Si las ventas totales de los clientes es mayor a 500.000 entonces que se cumpla la siguiente condicion :

Modificar el estatus de los clientes de menudeo(1) a mayoreo (2).


Mi base de datos cuenta con 10 tablas.
  • Clientes
  • Articulos
  • Datos_generales
  • detalle_art
  • Lineas
  • Localidad
  • Proveedores
  • Usuarios
  • Ventas_det
  • Ventas_generales

En ventas_det están los siguientes campos:
  • vd_folio (el folio de compra que tiene cada cliente)
  • vd_cod (el codigo del producto)
  • vd_cant (cantidad de lo que se compra)
  • vd_precio

en ventas_generales están los siguientes campos:
  • vg_folio (está es la llave primaria, aquí es folio por cliente de cada venta q realiza)
  • vg_cte (codigo del cliente)
  • vg_tipo
  • vg_status

Según yo... debo sumar todas las ventas que tiene 1 cliente dependiendo de su folio, si todas esas ventas q tiene el cliente son superiores a 500.000 entonces se cumpliria la condicion de cambiar el estatus de menudeo a mayoreo.

este estatus se cambia de la tabla clientes.

Así es como tengo mi desastre de query.. :


USE VENTAS
GO
ALTER PROCEDURE SP_VENTAS2
@OPCION AS TINYINT

AS
BEGIN
IF (@OPCION=1)
BEGIN
IF (select SUM (vd_precio * vd_cant) > 500 from ventas_det)
BEGIN
UPDATE clientes SET cl_estatus=2 where cl_estatus = 1
END
END
END
ELSE
BEGIN
SELECT ('Valor fuera de rango') as Mensaje
END

Me sale el siguiente error :

Mens 102, Nivel 15, Estado 1, Procedimiento SP_VENTAS2, Línea 7
Sintaxis incorrecta cerca de '>'.

No sé nisiquiera si tengo bien la condicion... de que si el total de las ventas de los clientes es mayor de 500.000 entonces ejecutara la condicon de actalizar el estatus...




Gracias!
  #2 (permalink)  
Antiguo 24/02/2012, 20:06
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Como condicionar SUM en procedimiento almacenado

Para actualizar una tabla en función de los valores de otra tabla tienes la sintaxis update from, por ejemplo:

Código:
update clientes 
  set cl_estatus = 2
from (
 select 
  ventas_generales.vg_cte 
 from 
  ventas_generales inner join ventas_det
   on ventas_generales.vg_folio =  ventas_det.vd_folio
 group by ventas_generales.vg_cte
 having sum(ventas_det.vd_precio * ventas_det.vd_cant) > 500
) t
where clientes.cte = t.vg_cte
Saludos
  #3 (permalink)  
Antiguo 25/02/2012, 04:46
 
Fecha de Ingreso: febrero-2012
Mensajes: 4
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Como condicionar SUM en procedimiento almacenado

Cita:
Iniciado por matanga Ver Mensaje
Para actualizar una tabla en función de los valores de otra tabla tienes la sintaxis update from, por ejemplo:

Código:
update clientes 
  set cl_estatus = 2
from (
 select 
  ventas_generales.vg_cte 
 from 
  ventas_generales inner join ventas_det
   on ventas_generales.vg_folio =  ventas_det.vd_folio
 group by ventas_generales.vg_cte
 having sum(ventas_det.vd_precio * ventas_det.vd_cant) > 500
) t
where clientes.cte = t.vg_cte
Saludos
Muchas gracias por tu respuesta! te comento que mientras intentaba buscar una solucion hice algo similar a lo que me acabas de dar... solo que primera vez que veo el HAVING con el SUM, así me quedo ayer :

USE VENTAS
GO
ALTER PROCEDURE SP_VENTAS2
@OPCION AS TINYINT

AS
BEGIN
IF (@OPCION=1)
BEGIN
IF (SUM (vd_precio * vd_cant > 500)
BEGIN
UPDATE clientes SET cl_estatus=2 from ventas_generales
INNER JOIN clientes ON vg_cte = cl_cve
INNER JOIN ventas_det ON vg_folio = vd_folio
WHERE cl_estatus=1 and SUM (vd_precio * vd_cant)>500
END
END
ELSE
BEGIN
SELECT ('Valor fuera de rango') as Mensaje
END
END


me sigue saliendo el error :

Mens 102, Nivel 15, Estado 1, Procedimiento SP_VENTAS2, Línea 8
Sintaxis incorrecta cerca de '>'.

osea me marca error en "IF (SUM (vd_precio * vd_cant > 500)" ... segun yo, primero debo poner esa condicion, si las ventas totales de todos los clientes es mayor a 500 entonces se hara el update, si no es pues no actualiza el estatus del cliente, estoy retrasada por esa sintaxis incorrecta.

acabo de poner lo del having sum...

USE VENTAS
GO
ALTER PROCEDURE SP_VENTAS2
@OPCION AS TINYINT

AS
BEGIN
IF (@OPCION=1)
BEGIN
IF (HAVING SUM (vd_precio * vd_cant)>500 )
BEGIN
UPDATE clientes SET cl_estatus=2 from ventas_generales
INNER JOIN clientes ON vg_cte = cl_cve
INNER JOIN ventas_det ON vg_folio = vd_folio
WHERE cl_estatus=1 and HAVING SUM (vd_precio * vd_cant)>500
END
END
ELSE
BEGIN
SELECT ('Valor fuera de rango') as Mensaje
END
END




me sale esto :

Mens 156, Nivel 15, Estado 1, Procedimiento SP_VENTAS2, Línea 8
Sintaxis incorrecta cerca de la palabra clave 'HAVING'.
Mens 156, Nivel 15, Estado 1, Procedimiento SP_VENTAS2, Línea 13
Sintaxis incorrecta cerca de la palabra clave 'HAVING'.


... Perdonen la molestía con esto, me agrada mucho mysql y lo que se relaciona con base de datos, tal vez esto sea algo muy facil pero, se me ha complicado un poco esto, no había tenido problemas hasta ahora..

Etiquetas: condicionar, procedimiento, sum, tabla, almacenar, campos
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 10:07.