IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

calcul moyenne prix


Sujet :

Développement SQL Server

  1. #1
    Membre expérimenté
    Homme Profil pro
    Développeur ASP.Net - disponible pour des missions
    Inscrit en
    Septembre 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ASP.Net - disponible pour des missions

    Informations forums :
    Inscription : Septembre 2008
    Messages : 151
    Par défaut calcul moyenne prix
    Bonjour à tous,

    je voudrais calculer un pmpa à partir d'une table mouvement de stock, et ce de manière dynamique, est-ce que quelqu'un a une idée ou un début de piste

    pour info un pmpa est un prix moyen pondéré d'achat

    voici un exemple de calcul de pmpa :
    ligne 1 qté=10 prix=1.00 pmp=1.00
    ligne 2 qté=-3 pmp=toujours 1.00
    ligne 3 qté=10 prix=2.00 pmp=1.63 (cad (7*1 + 10*2) / 17
    ...

    est-ce que c'est possible avec une seule requête

    merci d'avance pour vos réponses

  2. #2
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    est-ce que c'est possible avec une seule requête
    Surement mais j’avoue ne pas avoir compris votre calcul?

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur ASP.Net - disponible pour des missions
    Inscrit en
    Septembre 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ASP.Net - disponible pour des missions

    Informations forums :
    Inscription : Septembre 2008
    Messages : 151
    Par défaut
    c'est pas grave, disons que le résultat (une moyenne mettons) doit être calculé à partir des lignes n-1 et ainsi de suite

  4. #4
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    De quelles informations disposez vous dans votre table des transactions ?
    Avez vous un PMP de base ?

    ++

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur ASP.Net - disponible pour des missions
    Inscrit en
    Septembre 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ASP.Net - disponible pour des missions

    Informations forums :
    Inscription : Septembre 2008
    Messages : 151
    Par défaut
    Bonjour,

    merci pour votre aide

    je dispose de la quantité mouvementée et du prix, à partir de là je dois calculer le stock et le pmp au fil de l'eau

    mvt no 1
    qté mouvementée = 10
    prix = 1
    stock restant = 10
    pmp = 1

    mvt no 2
    qté mouvementée = -3
    prix = null
    stock restant = 7
    pmp = 1

    mvt no 3
    qté mouvementée = 10
    prix = 2
    stock restant = 17
    pmp = 1.59

    le stock c'est facile à comprendre, le pmp 1.59 est obtenu comme ceci :
    (valeur stock n-1 + valeur stock n) / (stock n-1 + stock n) soit
    (7.00 + 20.00) / (7 + 10) = 1.59

  6. #6
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Ah ben oui un PMP .. forcément la 1ere valeur correspond forcément au 1er prix d'achat

    Vous pouvez essayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    DECLARE @t TABLE
    (
     id_tran INT,
     qte INT,
     prix DECIMAL(5,2)
    );
     
    INSERT @t VALUES (1, 10, 1);
    INSERT @t VALUES (2, -3, 1);
    INSERT @t VALUES (3, 10, 2);
     
    WITH CTE 
    AS
    (
    	SELECT *, CAST(prix AS DECIMAL(15,2)) AS pmp
    	FROM @t
    	WHERE id_tran = 1
    	UNION ALL 
    	SELECT 
    		T.id_tran,
    		T.qte,
    		T.prix,
    		CAST((((CTE.qte + T.qte) * CTE.pmp) + T.qte * T.prix) / (CTE.qte + T.qte + T.qte) AS DECIMAL(15,2))
    	FROM @t AS T
    	INNER JOIN CTE
    	 ON CTE.id_tran + 1 = T.id_tran 
    )
    SELECT *
    FROM CTE;
    ++

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur ASP.Net - disponible pour des missions
    Inscrit en
    Septembre 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ASP.Net - disponible pour des missions

    Informations forums :
    Inscription : Septembre 2008
    Messages : 151
    Par défaut
    malheureusement je suis sur 2000, j'ai l'impression que les CTE ne passent pas

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur ASP.Net - disponible pour des missions
    Inscrit en
    Septembre 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur ASP.Net - disponible pour des missions

    Informations forums :
    Inscription : Septembre 2008
    Messages : 151
    Par défaut
    je valide la réponse, j'ai essayé sur un sql2008 et ça passe

    merci encore, ça me servira de tte façon

    pour ma base 2000 j'ai fais donc une fonction avec renvoi de table, pour ceux que ça interesse voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    CREATE FUNCTION FCT_STK_detail (@art_id int)  
    RETURNS @PAMPTable TABLE (stk_id int primary key,
    	stk_type varchar(50),
    	stk_quantite decimal(18,2),
    	stk_prix decimal(18,2),
    	stk_date datetime,
    	ble_numero varchar(50),
    	ble_fournisseur_nom varchar(50),
    	stock decimal(18,2),
    	pmp decimal(18,2)
    )
    AS  
     
    begin
     
    declare @stk_id int
    declare @stk_type varchar(50)
    declare @stk_quantite decimal(18,2)
    declare @stk_prix decimal(18,2)
    declare @stk_date datetime
    declare @ble_numero varchar(50)
    declare @ble_fournisseur_nom varchar(50)
    declare @pmp decimal(18,2)
    declare @stock decimal(18,2)
     
    set @pmp=0
    set @stock=0
     
    declare PAMP cursor scroll for  
    SELECT     stk_id, stk_type, stk_quantite, stk_prix, stk_date, ble_numero, ble_fournisseur_nom 
    FROM         dbo.STK_stock LEFT OUTER JOIN
                          dbo.BLL_bon_livraison_ligne ON dbo.STK_stock.BLL_id = dbo.BLL_bon_livraison_ligne.BLL_id LEFT OUTER JOIN
                          dbo.BLE_bon_livraison ON dbo.BLL_bon_livraison_ligne.BLE_id = dbo.BLE_bon_livraison.BLE_id
    where stk_stock.art_id=@art_id
    order by stk_date
    open PAMP
    	fetch next from PAMP into @stk_id, @stk_type, @stk_quantite, @stk_prix, @stk_date, @ble_numero, @ble_fournisseur_nom
    	while @@fetch_status = 0
    	begin
    		if (@stock + @stk_quantite) = 0
    			set @pmp = 0
    		else if @stk_quantite > 0
    			set @pmp =  ((@stock * @pmp) + (@stk_prix*@stk_quantite)) / (@stock + @stk_quantite)
     
    		set @stock=@stock + @stk_quantite
     
    		insert @PAMPTable select @stk_id, @stk_type, @stk_quantite, @stk_prix, @stk_date, @ble_numero, @ble_fournisseur_nom, @stock, @pmp
    		fetch next from PAMP into @stk_id, @stk_type, @stk_quantite, @stk_prix, @stk_date, @ble_numero, @ble_fournisseur_nom
    	end
    	close PAMP
    	deallocate PAMP
     
    	return
    END

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Je n'ai pas tout compris le mode de calcul (dans votre exemple, valeur stock n = 17 * 2 = 34 et non 20 ?) , mais si on considère plutôt

    (valeur stock n-1 + valeur mouvement n) / (stock n-1 + qte mouvementée n) , on peut faire comme ceci sachant que stock n-1
    + qté mouvementée = stock n)

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    DECLARE @t TABLE
    (
     id_tran INT,
     qte INT,
     prix DECIMAL(5,2)
    );
     
    INSERT @t VALUES (1, 10, 1);
    INSERT @t VALUES (2, -3, NULL);
    INSERT @t VALUES (3, 10, 2);
     
     
    SELECT 
    	id_tran,
    	qte, 
    	prix,
    	COALESCE(
    		(
    			(
    				(SELECT TOP(1) prix FROM @t A WHERE A.id_tran < Y.id_tran AND prix IS NOT NULL ORDER BY id_tran DESC)  --prix n-1
    				*
    				(SELECT SUM(qte) FROM @t B WHERE B.id_tran < Y.id_tran ) --qte mouvementée n-1
    				+
    				prix * qte
    			)	
    		/
    			(SELECT SUM(qte) FROM @t C WHERE C.id_tran <= Y.id_tran) --stock n
    		)
    		, 
    		(SELECT TOP(1) prix FROM @t D WHERE D.id_tran <= Y.id_tran AND prix IS NOT NULL ORDER BY id_tran DESC)
    	) AS pmp	
    FROM @t Y

    Je me suis basé sur les id pour "l'ordre" des mouvements, mais visiblement vous avez une colonne date, basez vous dessus.

    Comme je disais, je ne suis pas certain du calcul, le résultat de la requête ci-dessus est donc peut être faux, mais vous pouvez l'adapter sur le même principe pour vous passer de votre curseur...

  10. #10
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Par défaut
    Comment le stock est il gerer ?

    Lors de votre mouvement en sortie, le prix n'est pas indique.
    Est il gere en FIFO (first-in-first-out) ou bien en LIFO (last-in-last-out) ?
    Cela aura un impact sur votre PMP par la suite...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul de moyenne (prix au m²) en LINQ
    Par 404error dans le forum Linq
    Réponses: 10
    Dernier message: 12/10/2009, 15h28
  2. [MySQL] Aide envoie commande (calcul quantité + prix commande total)
    Par klue_ dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/05/2007, 11h49
  3. Calculer un prix
    Par Roromix dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/09/2006, 09h40
  4. Réponses: 35
    Dernier message: 10/05/2006, 01h11
  5. Calcul de prix unitaire moyen
    Par smail21 dans le forum Bases de données
    Réponses: 4
    Dernier message: 28/11/2005, 12h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo