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

Requêtes MySQL Discussion :

Sum sur un Max


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Sum sur un Max
    Bonjour à tous, voila j'ai une fonction qui me retourne des fois plusieurs valeurs.

    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
    ALTER  FUNCTION [dbo].[F_Get_ENCDE]  (@OrderNumber varchar(20))
     
    RETURNS Int
     
     
    AS
    BEGIN
    declare   @NB_CDE  int, @valeur varchar(20)
     
    set @NB_CDE=( select  max(OrderArticleLines.Amount * OrderArticleLines.PackQuantity)
    	FROM rsnetbplast.dbo.OrderArticleLines INNER JOIN
        rsnetbplast.dbo.StockItems ON OrderArticleLines.OrderNumber = @OrderNumber LEFT OUTER JOIN
        rsnetbplast.dbo.Orders ON OrderArticleLines.[Order] = Orders.Identifier
    	WHERE        (Orders.IsValidated = 1) AND (Orders.IsCompleted = 0) AND (OrderArticleLines.Received = 0)
    	GROUP BY OrderArticleLines.Amount * OrderArticleLines.PackQuantity)
     
     
    Return @NB_CDE;
     
    END
    Hors je souhaiterais avoir la Sum des valeurs quelle me retourne en lui laissant le select Max().

    Pourriez vous m’orienter vers la bonne procédure si cela est possible.

    Merci par avance

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2020
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2020
    Messages : 32
    Points : 96
    Points
    96
    Par défaut
    Bonjour,

    Quel est l'objectif final de la requête?

    Sachant qu'il y'a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY OrderArticleLines.Amount * OrderArticleLines.PackQuantity
    quel est l’intérêt d'utiliser une fonction agrégat sur une clause du group by?

    Si c'est pour faire un calcul au niveau d'une commande en particulier il faut faire un group by sur OrderArticleLines.OrderNumber

    En outre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN rsnetbplast.dbo.StockItems ON OrderArticleLines.OrderNumber = @OrderNumber
    Va renvoyer TOUS les enregistrements de la table StockItems dès que la condition OrderArticleLines.OrderNumber = @OrderNumber est vrai.
    Je ne penses pas que cela soit l'objectif désiré.

    Bref en l'état actuel dur de se prononcer.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Oui c'est vrai que je n'ai était assez explicite sur le but final de cette fonction.

    En fait cette fonction va chercher la quantité total d'articles qui sont en commande ( quantité * conditionnement).

    Ceci seulement pour les commandes qui sont validées, non complètes et pour lequel la ligne de l'article n'est pas réceptionné.

    Au départ je n'avais qu'une valeur donc tout était parfait, mais il s’avère que des commandes ont des délai très long donc l'article ce retrouve dans plusieurs commandes non reçu.

    C'est pour ça que la fonction me retourne plusieurs valeur. Si je ne fait pas le group by je me retrouve avec plus de 100 lignes identiques.

    Avec la fonction telle quelle est actuellement les valeurs données sont exactes mais je souhaiterai en avoir plus qu'une qui me fasse la somme des résultats.

    J’espère être assez compréhensible

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2020
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2020
    Messages : 32
    Points : 96
    Points
    96
    Par défaut
    Du coup je ne comprend encore moins cette jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INNER JOIN rsnetbplast.dbo.StockItems 
    	ON OrderArticleLines.OrderNumber = @OrderNumber
    A quoi sert la table StockItems dans cette requête? Elle n'est jamais exploitée.
    A quoi sert la variable @OrderNumber alors que la somme doit porter sur la totalité des commandes?

    Un inner join à la place du left outer join sur la table commande est également plus judicieux.

    Quelque chose comme ceci répond il à ton besoin?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select SUM(OAL.Amount * OAL.PackQuantity)
    FROM rsnetbplast.dbo.Orders O
    INNER JOIN rsnetbplast.dbo.OrderArticleLines OAL
    	ON OAL.[Order] = O.Identifier
    WHERE	(O.IsValidated = 1) 
    	AND (O.IsCompleted = 0) 
    	AND (OAL.Received = 0)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Bonjour, désolé du retard de réponse de ma part.

    Votre analyse est trés correct mais le problème c'est qu'avec la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select SUM(OAL.Amount * OAL.PackQuantity)
    FROM rsnetbplast.dbo.Orders O
    INNER JOIN rsnetbplast.dbo.OrderArticleLines OAL
    	ON OAL.[Order] = O.Identifier
    WHERE	(O.IsValidated = 1) 
    	AND (O.IsCompleted = 0) 
    	AND (OAL.Received = 0)
    je me retrouve avec un résultat qui est de 126801. (je m'attend plus a des valeurs du style "40", "60")

    Je vous met la requête qui appel cette fonction pour que vous puissiez avoir une meilleur vision de la demande.

    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
    /****** Script de la commande SelectTopNRows à partir de SSMS  ******/
    SELECT        OrderArticleLines.OrderNumber AS REFERENCE, OrderArticleLines.Description, StockItems.NumInStock AS STOCK, 
                             BPLASTNET.dbo.F_Get_ENCDE(OrderArticleLines.OrderNumber) AS 'EN CDE', BPLASTNET.dbo.F_GetQuantite_Reservation(OrderArticleLines.OrderNumber) 
                             AS RESERVE, OrderArticleLines.Amount AS 'A CDER', + CAST('X ' AS varchar) + CAST(CONVERT(decimal, OrderArticleLines.PackQuantity, 0) AS varchar) AS UDC, 
                             OrderArticleLines.Location, '' AS [QTE SOUHAITE]
    FROM            Orders INNER JOIN
                             OrderArticleLines ON Orders.Identifier = OrderArticleLines.[Order] LEFT OUTER JOIN
                             LinkColorsFinishGroups ON OrderArticleLines.LinkColorFinishGroupIn = LinkColorsFinishGroups.Identifier LEFT OUTER JOIN
                             StockOptions INNER JOIN
                             StockItems ON StockOptions.Identifier = StockItems.StockOption ON OrderArticleLines.OrderNumber = StockItems.OrderCode LEFT OUTER JOIN
                             Colors ON LinkColorsFinishGroups.ColorId = Colors.Identifier
    WHERE        (Orders.Identifier =
                                 (SELECT        MAX(Identifier) AS Expr1
                                   FROM            Orders AS Orders_1
                                   WHERE        (Description = 'SOMFY')))
    GROUP BY OrderArticleLines.OrderNumber, OrderArticleLines.Description, StockItems.NumInStock, BPLASTNET.dbo.F_Get_ENCDE(OrderArticleLines.OrderNumber), OrderArticleLines.PackQuantity,
                             BPLASTNET.dbo.F_GetQuantite_Reservation(OrderArticleLines.OrderNumber), OrderArticleLines.Amount, + CAST('X ' AS varchar) + CAST(CONVERT(decimal, 
                             OrderArticleLines.PackQuantity, 0) AS varchar), OrderArticleLines.Location
    HAVING        (StockItems.NumInStock + OrderArticleLines.Amount * OrderArticleLines.PackQuantity - BPLASTNET.dbo.F_GetQuantite_Reservation(OrderArticleLines.OrderNumber) 
                             >= 0)
    ORDER BY REFERENCE

    Elle n'est pas optimisée du tout mais je voulais l'essayer avant de m'y pencher

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    avec cette expression de besoin :

    Citation Envoyé par tidav4 Voir le message
    En fait cette fonction va chercher la quantité total d'articles qui sont en commande ( quantité * conditionnement).
    Ceci seulement pour les commandes qui sont validées, non complètes et pour lequel la ligne de l'article n'est pas réceptionné.
    Au départ je n'avais qu'une valeur donc tout était parfait, mais il s’avère que des commandes ont des délai très long donc l'article ce retrouve dans plusieurs commandes non reçu.
    Si vous communiquez la liste des tables avec leur description, la requête qui va bien devrait être assez facile à trouver

Discussions similaires

  1. [Vxi3] Valeur MIN ou MAX d'une SUM sur un indicateur ?
    Par samy37 dans le forum Designer
    Réponses: 5
    Dernier message: 11/08/2011, 19h09
  2. pb requete max sum sur 2 criteres.
    Par btsgreta77 dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/04/2009, 16h01
  3. SUM sur un ENUM
    Par megane dans le forum Langage SQL
    Réponses: 11
    Dernier message: 15/05/2006, 16h57
  4. Appeler une image faite sur 3DS Max ??
    Par CCin dans le forum OpenGL
    Réponses: 4
    Dernier message: 24/10/2005, 10h41
  5. Sum sur un champ Time
    Par Régent dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/02/2005, 23h39

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