2017-09-10 5 views
1

Si vous avez aucune idée de AVCO méthode perpétuelle juste de lire this article ou this one avant de passer par la question:Comment calculer le coût de l'entrepôt avec AVCO méthode perpétuelle

Pour le rendre plus clair, je mis les données que j'ai dans ma table de transaction:

colonne Quantité contient la quantité de produits qui ont été achetés ou vendus (nombres négatifs indiquent la vente inv oix)

Je dois écrire une requête dans SQL Server qui retourne un record comme celui-ci:

colonne Coût contient le coût du produit au moment de la transaction qui est calculée selon à AVCO méthode perpétuelle

Voici la requête que vous aurez besoin de générer une table et des données:

CREATE TABLE [dbo].[Transactions] 
    (
     [Id] [INT] NOT NULL , 
     [Date] [DATE] NOT NULL , 
     [Coefficient] [INT] NOT NULL , 
     [Quantity] [INT] NOT NULL , 
     [Price] [INT] NOT NULL , 
     [Cost] [REAL] NOT NULL , 
     CONSTRAINT [PK_Transactions] PRIMARY KEY CLUSTERED ([Id] ASC) 
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
       IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
       ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) 
ON [PRIMARY] 

GO 
INSERT [dbo].[Transactions] 
     ([Id], [Date], [Coefficient], [Quantity], [Price], [Cost]) 
VALUES (1, '2017-01-01', 1, 10, 100, 100), 
     (2, '2017-01-02', 1, 20, 120, 113.33), 
     (3, '2017-01-03', -1, 5, 200, 113.33), 
     (4, '2017-01-04', 1, 10, 150, 123.8), 
     (5, '2017-01-05', -1, 3, 200, 123.8), 
     (6, '2017-01-06', -1, 10, 200, 123.8), 
     (7, '2017-01-07', 1, 10, 180, 141.36), 
     (8, '2017-01-07', -1, 5, 220, 141.36) 

MISE À JOUR

Juste pour avoir une brève vue de la façon dont j'ai calculé le champ Coût:

((PreviousCost*PreviousStock)+(CurrentPrice*CurrentQuantity))/CurrentStock 
+0

Si marchandises vendues comment calculer le coût. J'ai atteint la réponse sans les enregistrements de facture de vente signifie que les enregistrements d'achat ont été effectués. @Seed Hamed. –

+0

@ShyamVemula Je dois considérer les articles vendus parce que les effets sur le stock. J'ai fait une mise à jour et expliqué brièvement comment calculer le coût. –

+0

J'espère que la réponse ci-dessous max. atteint ... –

Répondre

1

La requête suivante répondra à vos besoins.

CREATE TABLE #Temp 
(
Date1  DATE, 
AvgCost  decimal(18,4) 
) 

DECLARE @QTY  FLOAT, 
     @QTY1  FLOAT, 
     @Price  FLOAT, 
     @Date  DateTime, 
     @Cost  FLOAT, 
     @Cost1  FLOAT, 
     @RoundCost FLOAT 


SELECT @Cost = 0, @QTY = 0, @RoundCost=0 
DECLARE Cur_ CURSOR FOR 
SELECT [Date], [Coefficient]*[Quantity], [Price], ([Quantity] * [Price]) 
FROM [dbo].[Transactions] 
ORDER BY [Date] ASC, [Coefficient] DESC 

OPEN Cur_ 
FETCH NEXT FROM Cur_ INTO @Date, @QTY, @Price, @Cost 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    IF(@QTY > 0) 
    BEGIN 
    SELECT @Cost = @Cost + @RoundCost 
    END 
    ELSE 
    BEGIN 
    SELECT @Cost = (@Cost1 * (@[email protected])) 
    END 

    SELECT @QTY = @QTY + ISNULL(SUM([Coefficient]*[Quantity]),0) FROM [dbo].[Transactions] 
    WHERE [Date] < @Date 

    --SELECT @Date, @QTY, @Price, @Cost, @Cost/@QTY 
    INSERT INTO #Temp 
    SELECT @Date, @Cost/@QTY 
    SET @Cost1 = @Cost/@QTY 
    SET @QTY1 = @QTY 
    SET @RoundCost = @Cost 
    FETCH NEXT FROM Cur_ INTO @Date, @QTY, @Price, @Cost 
END 

CLOSE Cur_ 
DEALLOCATE Cur_ 

SELECT * FROM #Temp T 
DROP TABLE #Temp 

Sortie:

(1 row(s) affected) 
Date1  AvgCost 
---------- --------------------------------------- 
2017-01-01 100.0000 
2017-01-02 113.3333 
2017-01-03 113.3333 
2017-01-04 123.8095 
2017-01-05 123.8095 
2017-01-06 123.8095 
2017-01-07 141.3690 
2017-01-07 224.5273 

(8 row(s) affected) 
+0

Merci pour votre réponse, mais cette approche est trop lente et j'ai besoin d'une requête qui peut être utilisée comme un objet de vue. J'ai trouvé une table récursive en utilisant CTE mais c'est plutôt lent aussi. –