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 :

Calculer le nombre de jours de Rupture de stock


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Juin 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Juin 2019
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Calculer le nombre de jours de Rupture de stock
    Bonjour,

    Je m'excuse par avance si ce post ne se trouve pas dans la bonne section (étant novice je ne suis pas sûr).

    Voila mon problème, je souhaiterais connaitre le nombre total de jour de rupture depuis le début de l'année de mes articles.
    Exemple au 31/12/2018 stock = 0 en stock
    Reception le 01/02/2019= 100 en stock
    Rupture le 05/02/2019= 0 en stock
    reception le 15/02/2019= 25 en stock
    Rupture le 15/05/2019= 0 en stock

    Je voudrais une requête me donnant le nombre de jour de rupture total depuis le début de l'année soit 64 jours (31 jours en janvier + 10 jour en fevrier + 23 jours jusqu'à aujourd'hui.)

    Les colonnes de ma table se présente comme dans le fichier joint.

    J'ai essaye avec la requête suivant mais sans succès:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SUM (DATEDIFF(D,31/12/2019, 31/12/2019)) AS RUPTURE, ART_CODE
    FROM          dbo.ART_MVT
    WHERE MVT_STOCK<=0
    GROUP BY ART_CODE
    Si quelqu'un avait la solution cela me rendrait la vie bien plus agréable.

    Merci,
    Fichiers attachés Fichiers attachés

  2. #2
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous pouvez utiliser les fonctions fenêtrées pour cela.

    quelque chose comme :

    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
     
     WITH tmp AS (
    	SELECT 
    			ART_CODE
    		,	DATEDIFF(
    				DAY
    				, ART_DATE
    				, COALESCE(
    						LEAD(ART_DATE) OVER(PARTITION BY ART_CODE ORDER BY ART_DATE)
    					,	GETDATE()
    				)
    			) AS NbJours
    		,	ART_STOCK
    	FROM ART_MV
    	)
    SELECT 
    		ART_CODE
    	,	SUM(NbJours)
    FROM tmp
    WHERE ART_STOCK = 0
    GROUP BY ART_CODE

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Juin 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Juin 2019
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci beaucoup pour la réponse mais bien que cela semble marcher, j'obtiens des résultats qui sont bien trop élever plus de 4000 jours (la base existe depuis 2006). Est il possible de rajouter une contrainte type date debut 31/12/2018.

    Merci d'avance

  4. #4
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Bonsoir,

    Citation Envoyé par fg103 Voir le message
    Voila mon problème, je souhaiterais connaitre le nombre total de jour de rupture depuis le début de l'année de mes articles.
    Exemple au 31/12/2018 stock = 0 en stock
    Reception le 01/02/2019= 100 en stock
    Rupture le 05/02/2019= 0 en stock
    reception le 15/02/2019= 25 en stock
    Rupture le 15/05/2019= 0 en stock
    Perso j'ai un problème avec la description de vos données.
    Si le stock est réévalué de temps en temps (au 1/2, au 5/2 puis au 15/2) comment être sûr que les ruptures sont effectivement représentées ?
    En clair, le stock au 2/2 peut très bien être à 0 sans que ça apparaisse dans les données.

    Le fichier XL fourni montre une colonne MVT_STOCK mais qu'avec des valeurs positives
    Comme si on ne noterais que l'entrée (ou la sortie) en stock...
    et en plus les dates ne correspondent pas


    Dans l'état de description des données il me semble improbable de fournir une réponse juste sans invoquer la divination céleste.

    Dites-nous en plus.
    Le savoir est une nourriture qui exige des efforts.

  5. #5
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par fg103 Voir le message
    j'obtiens des résultats qui sont bien trop élever plus de 4000 jours (la base existe depuis 2006).
    Depuis 2006, donc depuis plus de 4000 jours... ça semble cohérent.
    Avez vous un exemple concret où le calcul est faux ? la colonne ART_DATE contient-elle des NULL ?

    Citation Envoyé par fg103 Voir le message
    Est il possible de rajouter une contrainte type date début 31/12/2018.

    Merci d'avance
    oui, vous pouvez mettre un filtre dans la requête

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Juin 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Juin 2019
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    [QUOTE=aieeeuuuuu;10990871]Depuis 2006, donc depuis plus de 4000 jours... ça semble cohérent.
    Avez vous un exemple concret où le calcul est faux ? la colonne ART_DATE contient-elle des NULL ?

    Alors, le calcul est juste car sur des articles où il n'y a quasiment aucune rupture depuis 2006 je trouve les résultats exact type 23 jours et quand je vérifie l'historique j'ai bien une rupture de 23 jours en 2014. Donc la requête est bonne, ci joint modifié pour correspondre à la base:


    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
     WITH tmp AS (
    	SELECT
    			ART_CODE
    		,	DATEDIFF(
    				DAY
    				, DOC_DATE
    				, COALESCE(
    						LEAD(DOC_DATE) OVER(PARTITION BY ART_CODE ORDER BY DOC_DATE)
    					,	GETDATE()
    				)
    			) AS NbJours
    		,	MVT_STOCK
    	FROM DBO.ART_MVT
    	)
    SELECT
    		ART_CODE
    	,	SUM(NbJours)
    FROM tmp
    WHERE MVT_STOCK = 0
    GROUP BY ART_CODE
    Par contre la requête ne me donne que les articles en ruptures or je souhaietrais avoir tout les articles indépendamment du fait qu'il ai eu une rupture ou non. Donc j'ai changé la condition WHERE MVT_STOCK = 0 Par DOC_DATE BETWEEN '31/12/2018' AND '31/12/2019' j'ai une erreur nom de colonne non valide. Voir imprime écran ci joint alors que DOC_DATE est utiliser dans la requête précédente sans problème.

    Des suggestions?

    Nom : Capture d’écran 2019-06-13 à 10.52.10.png
Affichages : 1373
Taille : 19,6 Ko

    Nom : Capture d’écran 2019-06-13 à 10.52.10.png
Affichages : 1373
Taille : 19,6 Ko

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Juin 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Juin 2019
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Nom : Capture d’écran 2019-06-13 à 10.51.09.png
Affichages : 894
Taille : 50,2 Ko

    Pardon ci joint la requête avec l'erreur

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Juin 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Juin 2019
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Michel.Priori Voir le message
    Perso j'ai un problème avec la description de vos données.
    Si le stock est réévalué de temps en temps (au 1/2, au 5/2 puis au 15/2) comment être sûr que les ruptures sont effectivement représentées ?
    En clair, le stock au 2/2 peut très bien être à 0 sans que ça apparaisse dans les données.
    Bonjour,

    En effet ca peut prêter à confusion en fait j'aurais du mettre

    Inventaire au 31/12/2018 stock = 0 en stock
    Reception le 01/02/2019= 100 en stock (soit 31 jours de rupture)
    livraison le 05/02/2019=100 pièces donc 0 en stock
    reception le 15/02/2019= 25 en stock (soit 10jours de rupture)
    livraison le 15/05/2019=25 pièces donc 0 en stock (soit rupture de 28 ... jours à aujourd'hui)

    Soit un total de 59J de rupture.

  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
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par fg103 Voir le message
    Par contre la requête ne me donne que les articles en ruptures or je souhaietrais avoir tout les articles indépendamment du fait qu'il ai eu une rupture ou non. Donc j'ai changé la condition WHERE MVT_STOCK = 0 Par DOC_DATE BETWEEN '31/12/2018' AND '31/12/2019' j'ai une erreur nom de colonne non valide. Voir imprime écran ci joint alors que DOC_DATE est utiliser dans la requête précédente sans problème.

    Des suggestions?
    Il faudrait aouter la colonne DOC_DATE dans la CTE(requete dans le WITH afin que celle-ci soit "disponible" dans la requete principale.

    Mais de toute façon, pour avoir également les articles sans rupture de stck, il faut modifier un peu la requete.

    Je propose ça (pas testé) :

    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
     
     WITH tmp AS (
    	SELECT
    			ART_CODE
    		,	CASE 
    				WHEN MVT_STOCK = 0 THEN 
    					DATEDIFF(
    				    	DAY
    				    	, DOC_DATE
    				    	, COALESCE(
    				    			LEAD(DOC_DATE) OVER(PARTITION BY ART_CODE ORDER BY DOC_DATE)
    				    		,	GETDATE()
    				    	)
    				    ) 
    				ELSE 0
    			END				AS NbJours
    	FROM DBO.ART_MVT
    	WHERE DOC_DATE  > '20181231'
    	)
    SELECT
    		ART_CODE
    	,	SUM(NbJours)
    FROM tmp
    GROUP BY ART_CODE

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Juin 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Juin 2019
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Ok je vais tester ça dès que possible, par contre sur une version antérieur de SQL serveur (2005) la fonction LEAD ne marche pas, une idée pour convertir la requête?

  11. #11
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    avec une double auto-jointure...

    Autant dire que les performance ne seront pas les mêmes...

  12. #12
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Bonsoir,
    Citation Envoyé par fg103 Voir le message
    j'aurais du mettre

    Inventaire au 31/12/2018 stock = 0 en stock
    Reception le 01/02/2019= 100 en stock (soit 31 jours de rupture)
    livraison le 05/02/2019=100 pièces donc 0 en stock
    reception le 15/02/2019= 25 en stock (soit 10jours de rupture)
    livraison le 15/05/2019=25 pièces donc 0 en stock (soit rupture de 28 ... jours à aujourd'hui)

    Soit un total de 59J de rupture.
    En fait j'espérais avoir une table des entrées sorties du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Id    Date            Valeur     Type
    1     31/12/2018        0      inventaire
    2     01/02/2019      100      entrée en stock
    3     15/02/2019      100      sortie du stock
    Car à partir de là il "suffit" de faire une table "calendrier" qui liste tous les jours de l'année pour avoir l'inventaire théorique par jour, puis, compter bêtement le nombre de ligne à 0.

    Mais bon, encore fallait-il avoir les données pour ça.
    Le savoir est une nourriture qui exige des efforts.

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Juin 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Juin 2019
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Michel.Priori Voir le message
    Bonsoir,


    En fait j'espérais avoir une table des entrées sorties du type

    Car à partir de là il "suffit" de faire une table "calendrier" qui liste tous les jours de l'année pour avoir l'inventaire théorique par jour, puis, compter bêtement le nombre de ligne à 0.

    Mais bon, encore fallait-il avoir les données pour ça.

    Bonjour,

    Alors j'ai réussi à créer ma requête avec LEAD par contre je n'arrive pas avec row number. Ci dessous ma requête définitive avec LEAD qui marche sans problème, donc ci quelqu'un a une alternative avec row number je suis preneur (en plus du nombre de jour de rupture la requête donne la somme des livraisons). Egalement joint un fichier excel exporter depuis notre système.

    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
    select FAR_CODE, ART_CODE, ART_LIB, 0 AS NBR_JOUR,
    (SELECT     SUM(MVT_SORTIE) AS Expr1
                                FROM          dbo.ART_MVT
                                WHERE      (DOC_DATE BETWEEN '31/12/2018' 
    AND '31/12/2019') AND (ART_CODE = articles.ART_CODE)) AS 
    QTE
    from articles where  (FAR_CODE BETWEEN 'L' AND 'L')
    union all
    SELECT
    	FAR_CODE,	ART_CODE , ART_LIB
    	,	SUM(NbJours)     AS NBR_JOUR ,0 AS QTE
    FROM (SELECT
    			ART_MVT.ART_CODE, ART_LIB,
    FAR_CODE
    		,	DATEDIFF(
    				DAY
    				, DOC_DATE
    				,  COALESCE(LEAD
    (DOC_DATE) OVER(PARTITION BY ART_MVT.ART_CODE
    ORDER BY DOC_DATE),GETDATE())
    			) AS NbJours
    		,	MVT_STOCK
    	FROM dbo.ART_MVT      LEFT OUTER JOIN
                          dbo.ARTICLES AS ART ON ART_MVT.ART_CODE =
    ART.ART_CODE
            WHERE DOC_DATE>'31/12/2018') AS tmp
    WHERE MVT_STOCK = 0 AND FAR_CODE BETWEEN 'L' AND 'L'
    GROUP BY ART_CODE, ART_LIB , FAR_CODE
    ORDER BY ART_CODE

    Merci
    Mouvements de stock.xls

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/08/2006, 14h43
  2. [Dates] Calculer le nombre de jours dans le mois suivant...
    Par Life Hunter dans le forum Langage
    Réponses: 5
    Dernier message: 14/03/2006, 00h01
  3. Calculer le nombre de jours restants
    Par localhost dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 27/01/2006, 17h31
  4. [Optimisation][Fonction]calcul du nombre de jours ...
    Par m-mas dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 26/10/2005, 14h39
  5. calcule du nombre de jours entre 2 dates
    Par nazimb dans le forum ASP
    Réponses: 4
    Dernier message: 28/09/2004, 15h22

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