Consulta Dificil

21/09/2004 - 03:50 por K | Informe spam
Hola grupo necesito hacer una consulta para sacar
unos costos promedios he intentado hacerlo, sin exito.
Espero me puedan ayudar un poco con esto.
Estas son los script de las tres tablas que uso.


TABLA Documento
CREATE TABLE [dbo].[Documento] (
[NumeroMovimiento] [int] NOT NULL ,
[TipoDocumento] [char] (1) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[NumeroDocumento] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[FechaDocumento] [smalldatetime] NOT NULL ,
[AlmacenOrigen] [char] (2) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[AlmacenDestino] [char] (2) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[TipoMovimiento] [char] (2) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[FechaMovimiento] [smalldatetime] NOT NULL ,
[CodigoCliente] [int] NULL ,
[CodigoProveedor] [int] NULL ,
[Estado] [smallint] NOT NULL ,
[CantidadTotal] [decimal](18, 0) NOT NULL ,
[CantidadInf] [decimal](18, 0) NOT NULL ,
[SerieCotizacion] [char] (3) COLLATE Modern_Spanish_CI_AS NULL ,
[CodigoCotizacion] [char] (7) COLLATE Modern_Spanish_CI_AS NULL ,
[PrecioTotal] [numeric](19, 4) NOT NULL ,
[PrecioInf] [numeric](19, 4) NOT NULL ,
[CodigoTransportista] [smallint] NULL ,
[CodigoAuto] [nvarchar] (10) COLLATE Modern_Spanish_CI_AS NULL ,
[TipoSalida] [smallint] NULL ,
[CodigoVendedor] [smallint] NULL ,
[Responsable] [smallint] NULL ,
[TipoDocumentoCompra] [tinyint] NULL ,
[CodigoMoneda] [smallint] NULL ,
[CodigoFormaPago] [smallint] NULL ,
[FechaVencimiento] [smalldatetime] NULL ,
[TextoSalida] [nvarchar] (50) COLLATE Modern_Spanish_CI_AS NULL ,
[NombreCliente] [nvarchar] (150) COLLATE Modern_Spanish_CI_AS NULL
) ON [PRIMARY]

Tabla Movimientos
CREATE TABLE [dbo].[Movimientos] (
[NumeroMovimiento] [int] NOT NULL ,
[CodigoArticulo] [char] (12) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[FechaMovimiento] [smalldatetime] NOT NULL ,
[Cantidad] [decimal](18, 0) NOT NULL ,
[CodigoMoneda] [char] (1) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Precio] [money] NULL ,
[Costo] [money] NULL ,
[Descuento1] [money] NULL ,
[Descuento2] [money] NULL
) ON [PRIMARY]

Tabla CostosPromedios
CREATE TABLE [dbo].[CostosPromedios] (
[CodigoArticulo] [nvarchar] (12) COLLATE Modern_Spanish_CI_AS NULL,
[Fecha] [smalldatetime] NULL ,
[Cantidad] [decimal](10, 2) NULL ,
[PrecioPromedio] [money] NULL
) ON [PRIMARY]

Ahora yo hago la sgte consulta de un solo articulo
en la cual saco sus movimientos, lo que quiero hacer
es que cuando el movimiento sea un ingreso el costo
se repita en los movimientos que siguen hasta que allá
otro ingreso y para los movimientos anteriores a un ingreso
en ese rango de fecha sacar el ultimo costo de la tabla
Costos Promedios.

SELECT TOP 100 PERCENT dbo.Documento.NumeroMovimiento,
dbo.Movimientos.CodigoArticulo, CASE WHEN TipoMovimiento='S' THEN
-dbo.Movimientos.Cantidad ELSE dbo.Movimientos.Cantidad END Cantidad,
tipomovimiento,dbo.Documento.FechaDocumento,dbo.Movimientos.Costo
FROM dbo.Documento INNER JOIN
dbo.Movimientos ON dbo.Documento.NumeroMovimiento dbo.Movimientos.NumeroMovimiento
WHERE (dbo.Documento.FechaDocumento
BETWEEN '01/02/2004' AND '29/02/2004') AND
(dbo.Movimientos.CodigoArticulo = 'TRMEAF50 01')
ORDER BY dbo.Documento.FechaDocumento, dbo.documento.numeromovimiento

Espero haberme explicado bien.

Gracias por su tiempo

Salu2
 

Leer las respuestas

#1 Javier Loria
22/09/2004 - 02:48 | Informe spam
Hola:
Vamos a ver si entendi, pero antes unos supuestos
a) Llave Primaria de Documento es NumeroMovimiento .
b) Llave Primaria de Movimientos es NumeroMovimiento, CodigoArticulo.
c) Llave Primaria de Costos Promedios es CodigoArticulo, Fecha.
d) El costo de un articulo es el costo de la ultima compra o en su defecto
el ultimo costo anterior en Costos Promedios.
Si es asi talvez algunas vistas pueden ayudar:
CREATE VIEW MovimientosConTipo
AS
SELECT Documento.NumeroMovimiento
, Movimientos.CodigoArticulo
, Documento.TipoMovimiento
, CASE WHEN Documento.TipoMovimiento='S'
THEN -Movimientos.Cantidad
ELSE Movimientos.Cantidad END AS Cantidad
, Documento.FechaDocumento
, Movimientos.Costo
FROM Documento
INNER JOIN Movimientos
ON Documento.NumeroMovimiento = Movimientos.NumeroMovimiento
GO

CREATE VIEW NumeroUltimoCostoMovimiento
AS
SELECT Movimientos.NumeroMovimiento
, Movimientos.CodigoArticulo
, MAX(Costos.NumeroMovimiento) AS NumeroMovimientoUltimoCosto
FROM Movimientos
LEFT JOIN MovimientosConTipo AS Costos
ON Movimientos.CodigoArticulo=Costos.CodigoArticulo
AND Movimientos.NumeroMovimiento>=Costos.NumeroMovimiento
AND Costos.TipoMovimiento='I'
GROUP BY Movimientos.NumeroMovimiento, Movimientos.CodigoArticulo
GO

CREATE VIEW MovimientoUltimaFecha
AS
SELECT Movimientos.NumeroMovimiento
, Movimientos.CodigoArticulo
, MAX(CostosPromedios.Fecha) AS FechaCosto
FROM Movimientos
JOIN CostosPromedios
ON Movimientos.CodigoArticulo= CostosPromedios.CodigoArticulo
AND Movimientos.FechaMovimiento>=CostosPromedios.Fecha
GROUP BY Movimientos.NumeroMovimiento
, Movimientos.CodigoArticulo
GO
La primera es solo para simplificar, la segunda y la tercera te dan la
informacion necesaria para hacer los JOIN necesarios para encontra la ultima
compra anterior y el ultimo costo promedio anterior. Basadas en estas se
puede construir:
SELECT MCT.NumeroMovimiento
, MCT.CodigoArticulo
, MCT.Cantidad
, MCT.FechaDocumento
, COALESCE(Costos.Costo, CP.PrecioPromedio) AS NuevoCosto
FROM MovimientosConTipo AS MCT
LEFT JOIN NumeroUltimoCostoMovimiento AS NUC
ON MCT.NumeroMovimiento=NUC.NumeroMovimiento
AND MCT.CodigoArticulo=NUC.CodigoArticulo
LEFT JOIN Movimientos AS Costos
ON NUC.NumeroMovimientoUltimoCosto=Costos.NumeroMovimiento
AND NUC.CodigoArticulo=Costos.CodigoArticulo
LEFT JOIN MovimientoUltimaFecha AS MUF
ON MCT.NumeroMovimiento=MUF.NumeroMovimiento AND
MCT.CodigoArticulo= MUF.CodigoArticulo
LEFT JOIN CostosPromedios AS CP
ON MUF.CodigoArticulo=CP.CodigoArticulo
AND MUF.FechaCosto=CP.Fecha
Espero que sea lo que necesitas.Claro el desempeno de este mounstro es
otra cosa.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"" wrote in message
news:
Hola grupo necesito hacer una consulta para sacar
unos costos promedios he intentado hacerlo, sin exito.
Espero me puedan ayudar un poco con esto.
Estas son los script de las tres tablas que uso.


TABLA Documento
CREATE TABLE [dbo].[Documento] (
[NumeroMovimiento] [int] NOT NULL ,
[TipoDocumento] [char] (1) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[NumeroDocumento] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[FechaDocumento] [smalldatetime] NOT NULL ,
[AlmacenOrigen] [char] (2) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[AlmacenDestino] [char] (2) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[TipoMovimiento] [char] (2) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[FechaMovimiento] [smalldatetime] NOT NULL ,
[CodigoCliente] [int] NULL ,
[CodigoProveedor] [int] NULL ,
[Estado] [smallint] NOT NULL ,
[CantidadTotal] [decimal](18, 0) NOT NULL ,
[CantidadInf] [decimal](18, 0) NOT NULL ,
[SerieCotizacion] [char] (3) COLLATE Modern_Spanish_CI_AS NULL ,
[CodigoCotizacion] [char] (7) COLLATE Modern_Spanish_CI_AS NULL ,
[PrecioTotal] [numeric](19, 4) NOT NULL ,
[PrecioInf] [numeric](19, 4) NOT NULL ,
[CodigoTransportista] [smallint] NULL ,
[CodigoAuto] [nvarchar] (10) COLLATE Modern_Spanish_CI_AS NULL ,
[TipoSalida] [smallint] NULL ,
[CodigoVendedor] [smallint] NULL ,
[Responsable] [smallint] NULL ,
[TipoDocumentoCompra] [tinyint] NULL ,
[CodigoMoneda] [smallint] NULL ,
[CodigoFormaPago] [smallint] NULL ,
[FechaVencimiento] [smalldatetime] NULL ,
[TextoSalida] [nvarchar] (50) COLLATE Modern_Spanish_CI_AS NULL ,
[NombreCliente] [nvarchar] (150) COLLATE Modern_Spanish_CI_AS NULL
) ON [PRIMARY]

Tabla Movimientos
CREATE TABLE [dbo].[Movimientos] (
[NumeroMovimiento] [int] NOT NULL ,
[CodigoArticulo] [char] (12) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[FechaMovimiento] [smalldatetime] NOT NULL ,
[Cantidad] [decimal](18, 0) NOT NULL ,
[CodigoMoneda] [char] (1) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Precio] [money] NULL ,
[Costo] [money] NULL ,
[Descuento1] [money] NULL ,
[Descuento2] [money] NULL
) ON [PRIMARY]

Tabla CostosPromedios
CREATE TABLE [dbo].[CostosPromedios] (
[CodigoArticulo] [nvarchar] (12) COLLATE Modern_Spanish_CI_AS NULL,
[Fecha] [smalldatetime] NULL ,
[Cantidad] [decimal](10, 2) NULL ,
[PrecioPromedio] [money] NULL
) ON [PRIMARY]

Ahora yo hago la sgte consulta de un solo articulo
en la cual saco sus movimientos, lo que quiero hacer
es que cuando el movimiento sea un ingreso el costo
se repita en los movimientos que siguen hasta que allá
otro ingreso y para los movimientos anteriores a un ingreso
en ese rango de fecha sacar el ultimo costo de la tabla
Costos Promedios.

SELECT TOP 100 PERCENT dbo.Documento.NumeroMovimiento,
dbo.Movimientos.CodigoArticulo, CASE WHEN TipoMovimiento='S' THEN
-dbo.Movimientos.Cantidad ELSE dbo.Movimientos.Cantidad END Cantidad,
tipomovimiento,dbo.Documento.FechaDocumento,dbo.Movimientos.Costo
FROM dbo.Documento INNER JOIN
dbo.Movimientos ON dbo.Documento.NumeroMovimiento > dbo.Movimientos.NumeroMovimiento
WHERE (dbo.Documento.FechaDocumento
BETWEEN '01/02/2004' AND '29/02/2004') AND
(dbo.Movimientos.CodigoArticulo = 'TRMEAF50 01')
ORDER BY dbo.Documento.FechaDocumento, dbo.documento.numeromovimiento

Espero haberme explicado bien.

Gracias por su tiempo

Salu2


Preguntas similares