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

consulta sql método Precio Medio Ponderado antes de cada salida

Estas en el tema de consulta sql método Precio Medio Ponderado antes de cada salida en el foro de SQL Server en Foros del Web. Esta es una consulta que paso a ser un reto del cual sali vencido.Por eso recurro a este foro, por si hay alguna persona que ...
  #1 (permalink)  
Antiguo 11/08/2009, 18:59
 
Fecha de Ingreso: agosto-2009
Mensajes: 1
Antigüedad: 14 años, 8 meses
Puntos: 0
Busqueda consulta sql método Precio Medio Ponderado antes de cada salida

Esta es una consulta que paso a ser un reto del cual sali vencido.Por eso recurro a este foro, por si hay alguna
persona que me entienda y haya pasado por lo mismo, pido que me ayude.Realmente es angustiante............gracias.


método Precio Medio Ponderado antes de cada salida(Sistema Inventario Perpetuo)

La importancia de valorar el coste de la mercancía vendida viene dada porque el
resultado del ejercicio es la diferencia entre las ventas y el coste de esas ventas,
y no por la diferencia entre compras y ventas.

Este método de control de inventarios tiene como características fundamentales las siguientes:

1 cada vez que entra en el almacén un lote de mercancía(debe ser recalculado.)
se multiplica Cantidad Unidad x Costo Unidad ,y se divide por el saldo acumulado de Cantidad Unidad
__________________________________________________ __________________________________________________ ____
Sum(Cantidad Unidad * Costo Unidad )as SaldoCostoTotal / Sum(Cantidad Unidad) as SaldoUnidad
se divide el saldo Costo Total con saldo unidad para obtener Promedio Ponderado
__________________________________________________ __________________________________________________ _____

2 La existencia física es presentada en un solo total, en vez de estar
segregado en lotes según el orden de entrada.

3 El costeo de las unidades que van saliendo,
se hace en base a la multiplicacion de la cantidad de salida por el costo promedio calculado inmediato anterior.



Estos son los unicos campos que se encuentran con valores

Fecha :es la fecha de la compra
cantidad Unidad entrada(Compras)
Cantidad Unidad salida(Ventas)
Costo unidad Entrada(Compras)

y estos los que debemos obtener:

Costo unidad
-------------
si es Salida(ventas)=(Promedio Ponderado Inmeditato Anterior)

Costo total
------------

si es ventas (Cantidad Unidad Salida) x (Promedio Ponderado Inmeditato Anterior)
si es compras(Cantidad Unidad Entrada)x(Costo Unidad Entrada)

Promedio Ponderado
--------------------
Acumulacion de SUM(cantidad Unidad entrada * Costo unidad Entrada) / SUM(cantidad Unidad entrada)

Saldo Costo total
------------------
Es la acumulacion o Saldo de Costo total Sumando si es Entrada(compras)o restando si es salida(Ventas)
------------------------------------------------------------------------------------------------------------
Mi problema es seguir el acumulado al momento de producirce una venta,
!Solo en un registro con la sentencia SQL,si es posible.

Lo que deseo obtener es el promedio ponderado,el costo total y el saldo costo total,
desde el inicio de inventario,la primera compra hasta una fecha X,que ingrese el usuario.

Ej. desde May 01 hasta May 25(X) o la fecha que desee el usuario.

Fecha__tran_____Cant__._Costo____Saldo___Promedio_ _Costo_____Saldo
______ saccion_Unidad__UnIdad__Unidad__ Ponderado__Total_____Costo tot

May25_|Venta___(400)___?13.16___700____?$13.16__$-5.264____ $9.211
solo un registro necesito.

----------------------------------------------------------------------------------------------------------------
Ejemplo 01.
__________________________________________________ ___
Fecha__tran_____Cant__._Costo____Saldo___Promedio_ _Costo_____Saldo
______ saccion_Unidad__UnIdad__Unidad__ Ponderado__Total_____Costo tot
__________________________________________________ __
May01|Comienzo__ 700____$10_____700____ $10_______ $7.000___ $7.000
May03|Compra____100____$12_____800____ $10.25(*1)__$1.200___ $8.200
May08|Venta_____(500)____ ??______300___ ?$10.25_____$-5.125___ $3.075
May15|Compra____600____$14_____900____ $12.75(*2)__ $8.400__$11.475
May19|Venta_____ 200____$15___ 1.100____ $13.16(*3)__ $3.000__$14.475
May25|Venta____ (400)____ ??_____ 700___ ?$13.16_____$-5.264___ $9.211
May27|Venta____ (100)____ ??_____ 600___ ?$13.16_____$-1.316___ $7.895
May31|fin inv.______??_____??_____

-----------------------------------------------------------------------------------

(*1) May 03 costo Promedio de 800 unidades
= (700x$10 + 100x$12) / (700 + 100)
= ( $7,000 + $1,200 ) / 800
= $8,200 / 800
= $10.25 Promedio Ponderado

Cost of goods sold on May 8 = 500x$10.25 = $5,125

(*2) May 15 costo Promedio de 900 units
= (300x$10.25 + 600x$14) / (300 + 600)
= ( $3,075 + $8,400 ) / 900
= $11,475 / 900
= $12.75 Promedio Ponderado

(*3) May 19 costo Promedio de 1,100 units
= (900x$12.75 + 200x$15) / (900 + 200)
= ( $11,475 + $3,000) / 1,100
= $14,475 / 1,100
= $13.16 Promedio Ponderado

Cost of goods sold on May 25 = 400x$13.16 = $5,264
Cost of goods sold on May 27 = 100x$13.16 = $1,316
-----------------------------------------------------------
- Total cost of goods sold
-----------------------------------------------------------
= 500x$10.25 + 400x$13.16 + 100x$13.16
= $5,125 + $5,264 + $1,316
= $11,705

--------------------------------------------------------------------------
Cost of ending inventory
--------------------------------------------------------------------------
= Beginning inventory + Costo de Compras -Total Cost
of goods sold
--------------------------------------------------------------------------
= $7,000 + (100x$12 + 600x$14 + 200x$15) - $11,705
= $7,000 + $12,600 - $11,705
= $7,895
--------------------------------------------------------------------------


'este es el Diseño de mi tabla con la insercion de algunos datos para realizar las
pruebas para obtener los resultados que deseo.(los mismos valores del ejemplo 01 de mas arriba)
La unica diferencia de mi tabla con el ejemplo 01 es que tengo
un campo para cantidad unitaria de entradas(Ex_Cantent)
y otro para cantidad unitaria de salidas(EX_CantSal) mas un campo autonumerico(Ex_Corr)
Mi tabla se llama Existencia.

create table Existencia (Ex_Corr int auto_increment,
Ex_Fecha datetime,
Ex_codigo nvarchar(16),
Ex_CantEnt money,
Ex_CantSal money,
Ex_PrecComp money)
go

insert into Existencia (Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_Cant Sal)
values
('01-05-2009 0:00:00','500',700,0,10)

insert into Existencia (Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_Cant Sal)
values
('03-05-2009 0:00:00','500',100,0,12)

insert into Existencia (Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_Cant Sal)
values
('08-05-2009 0:00:00','500',0,500,0)

insert into Existencia (Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_Cant Sal)
values
('15-05-2009 0:00:00','500',600,0,14)

insert into Existencia (Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_Cant Sal)
values
('19-05-2009 0:00:00','500',200,0,15)

insert into Existencia (Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_Cant Sal)
values
('25-05-2009 0:00:00','500',0,400,0)

insert into Existencia (Ex_Fecha,Ex_codigo,Ex_PrecComp,Ex_CantEnt,Ex_Cant Sal)
values
('27-05-2009 0:00:00','500',0,100,0)

update Existencia set Ex_Fecha = CONVERT(char(10), Ex_Fecha, 103)

-----------------------------------
'este es mi avance
'Vista
SELECT TOP (100) PERCENT CONVERT(char(10), Ex_Fecha, 103) AS [Order Date], Ex_PrecComp,
CASE WHEN Ex_CantEnt > 0 THEN Ex_CantEnt ELSE - Ex_CantSal END AS Ex_CanEnt,
(SELECT SUM(CASE WHEN Ex_CantEnt > 0 THEN Ex_CantEnt
ELSE - Ex_CantSal END) AS SaldoCantidadUnitaria
FROM dbo.Existencia AS M2
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr)) AS SaldoCantidadUnitaria,
(CASE WHEN Ex_CantEnt > 0 THEN
(SELECT SUM(Ex_CantEnt * Ex_PrecComp) / SUM(Ex_CantEnt) AS PPv_Entradas
FROM dbo.Existencia AS M56
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr))
ELSE -
(SELECT SUM(Ex_CantEnt * Ex_PrecComp) / SUM(Ex_CantEnt) AS PPv_Salidas
FROM dbo.Existencia AS M56
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr))
END) AS PromedioPonderado,
Ex_CantEnt * Ex_PrecComp AS Cant_X_prComp,
(CASE WHEN Ex_CantEnt > 0 THEN
(SELECT SUM(ex_Cantent * ex_PrecComp) AS PPv_Ent
FROM dbo.Existencia AS M56
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr))
ELSE
(SELECT SUM(Ex_Cantsal) * (SUM(Ex_CantEnt * Ex_PrecComp) / SUM(Ex_CantEnt)) AS CostoUnitarioEntrada
FROM dbo.Existencia AS M565
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr))
-(SELECT SUM(ex_Cantent * ex_PrecComp) AS PPv_Ent
FROM dbo.Existencia AS M56
WHERE (Ex_Codigo = O.Ex_Codigo) AND (Ex_corr <= O.Ex_corr))
END) AS CostoUnidad
FROM dbo.Existencia AS O
WHERE (Ex_Codigo = N'500')
ORDER BY Ex_corr
-----------------------------------------------------------------------------------------------------------
como la tabla no tiene un campo que indique si es entrada (compras) o salida(ventas)
el campo Ex_CantEnt asume esta condicion.
Si Ex_CantEnt > 0 si hay un valor quiere decir que es entrada (compras)
si Ex_CantEnt = 0 si no hay un valor quiere decir que es salida (ventas). y Ex_CantSal tiene el valor superior a 0.
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 07:39.