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 et SQL. Discussion :

Pour tuple(code,statut,valeur) trouver pour chaque code le tuple(max(value), statut de Max(value)) [Toutes versions]


Sujet :

Requêtes et SQL.

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut Pour tuple(code,statut,valeur) trouver pour chaque code le tuple(max(value), statut de Max(value))
    Voilà le problème :

    Je cherche à obtenir
    Code Max(Valeur) pour
    tuple(code)
    Statut pour le
    tulple (code,Max(valeur) )


    Sur une table dont la structure est la suivante

    Code Statut Valeur
    c1 s1 1
    c1 s2 5
    Aa s3 9
    Aa s1 6
    Dc s5 8
    Dc s6 3
    Non
    exhaustif ....

    Donc je veux avoir
    Code statut Valeur
    c1 s2 5
    Aa s3 9
    Dc s5 8


    Merci par avance pour toute aide

  2. #2
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 071
    Par défaut
    Bonjour,

    Tu peux le faire aisément en 2 temps :
    une premiere requete qui te donne le max pour chaque statut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT T_statutMax.statut, Max(T_statutMax.valeur) AS MaxDevaleur
    FROM T_statutMax
    GROUP BY T_statutMax.statut;
    puis une deuxieme requete qui te sélectionne la ligne de la premiere requete qui as le plus gand MaxdeValeur

    CDLT

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Bonjour micniv

    Merci pour ta solution mais cela ne fonctionne pas car tu fais un group by sur un seul champ or je veux récupérer les 3 champs

    De plus le tableau n'est pas exhaustif, tu auras aussi d’autres codes
    c2, c3...cX

    Toujours avec un nombre de statuts non fini

    Enfin, il faut pouvoir définir un statut par défaut en cas d’égalité des valeurs pour plusieurs statuts différents. Ce statut sera le même pour tous les cas d’égalité

  4. #4
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 071
    Par défaut
    Dés le début du fil, essaie de spécifier le cas générique de ce que tu souhaites, sinon ca dure et c'est dur ...
    Dans ton exemple la colonne code valait toujours c1 , il n'y avait pas d'intérêt à la placer dans le group by

    ALORS si tu as d'autres champs C1, C2 ... tu les ajoutes au GROUP BY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT C1, C2, statut, Max(T_statutMax.valeur) AS MaxDevaleur
    FROM T_statutMax
    GROUP BY C1, C2, statut;
    CDLT

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Merci pour ton aide mais si tu lis bien ma réponse, le nombre de valeurs du champ code n’est pas connu et il peut y avoir n’importe quelle valeur dans le champ code, exemple:

    Aaa
    Seder
    Fvdeg
    C1
    Vvf13
    Zées
    Etc.....etc donc 10, 30, 1000 valeurs différentes sans limitation donc impossible de les indiquer dans le select

    Comme dans le champ statut il peut y avoir 10, 20, 1000 plus valeurs différentes sans limitation

    Donc pour le tuple
    • (code) -> N valeurs de STATUT
    • (code, statut) -> N valeurs de VALEUR


    Mon besoin est d’avoir le statut associé à la valeur la plus grande du tuple (statut,valeur) du tuple (code)

  6. #6
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 071
    Par défaut
    Le nombre de valeurs du champ code c'est le nb de lignes ramené par la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Code, statut, Max(T_statutMax.valeur) AS MaxDevaleur
    FROM T_statutMax
    GROUP BY Code, statut;
    Après tu exploites cette requete selon tes souhaits

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Cela ne répond pas à mon besoin puisque tu fais un group by sur code et statut

    Une solution serait d’utliser une requête nommée qryMaxvaleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select code, max(valeur) as maxval from table group by code
    Puis faire une jointure entre entre table et qryMaxvaleur sur code et Maxval = valeur

    Mais cela n’est pas suffisant car la jointure peut ramener plusieurs lignes de TABLE pour (code, maxval) et la requête ne permet pas de définir quel statut est a prendre par défaut (hiérarchisation)

    Il faut donc en plus un table qui indique la hiérarchie entre les statuts


    Et la requête finale est encore loin d’être finalisée

  8. #8
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 071
    Par défaut
    Maintenant que tes specifs sont claires :

    Tu crées une table T_statut qui ordonne les statuts (statut, statut_ordre)
    une premiere requete QRY11 qui ajoute l'ordre à la table initiale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT T_tupleMax.code, T_tupleMax.statut, T_statut.Statut_ordre, T_tupleMax.valeur
    FROM T_statut INNER JOIN T_tupleMax ON T_statut.Statut = T_tupleMax.statut;
    Une deuxième requete QRY12 pour les max par code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT qry11.code, Max(qry11.valeur) AS MaxDevaleur
    FROM qry11
    GROUP BY qry11.code;
    enfin une 3 eme requête QRY13 qui te donne le résultat attendu :
    ici j'ai retenu le statut d'ordre minimal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T1.code, T1.statut, T1.Statut_ordre, T1.valeur
    FROM (qry11 as T1 INNER JOIN qry12 AS T2 ON (T1.valeur = T2.MaxDevaleur) AND (T1.code = T2.code)) 
    WHERE T1.Statut_ordre = (SELECT MIN(T3.Statut_ordre) FROM qry11 as T3
    WHERE T3.code = T1.code AND  T3.valeur = T1.valeur);
    CDLT

  9. #9
    Expert confirmé Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 350
    Par défaut
    Salut
    A tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT codes, DLookUp("statut","Table1","Valeur =" & Max([valeur]) & " AND codes = '" & [codes] & "'") AS StatutMax, Max(valeur) AS ValeurMax
    FROM Table1
    GROUP BY Table1.codes;
    EDIT : a priori c'est bon

  10. #10
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 071
    Par défaut
    Mes respects Hyperion pour ta requete unique. je n'avais jamais encore vu ni osé utilisé un DISTINCT en même temps qu'un GROUP BY ! intéressant ...
    Seulement, je pense que tu ne réponds pas à la spécif. (à tiroirs) d'Informer: si plusieurs tuples code, valeur sont trouvés pour une même valeur, on retient le statut d'ordre MAX (donc besoin d'une table auxiliaire pour les ordres des statuts)

    Bon dimance

  11. #11
    Expert confirmé Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 350
    Par défaut
    Re,
    Effectivement, mais ma req est un peu bancale, elle ne donne pas toujours le bon résultat.
    Mais peut-être qu'en cherchant à faire plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT codes, Max(statut) AS StatutMax, Max(valeur) AS ValeurMax
    FROM Table1
    GROUP BY codes;

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Merci à tous les deux pour votre aide.


    Pour voir ce que cela donnait j'ai transposé la requête d'hyperion13

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT [Code], DLookUp("[Status]","QTest_StatusQty_Max","[Qty] =" & Max([Qty]) & " AND [Status] = '" & [Status] & "'") AS StatutMax, Max([Qty]) AS ValeurMax
    FROM QTest_StatusQty_Max
    GROUP BY [Code]
    La table QTest_StatusQty_Max avec comme données en exemple

    Code Status Qty
    101699 Active 68.08
    101699 Inactive 300


    Et j'ai l'erreur suivante

    Nom : error_sql.jpg
Affichages : 179
Taille : 33,0 Ko

    Par contre avec l'ajout de Status dans le group by pas de problème
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT QTest_StatusQty_Max.[Code], QTest_StatusQty_Max.Status, DLookUp("[Status]","QTest_StatusQty_Max","[Qty] =" & Max([Qty]) & " AND [Status] = '" & [Status] & "'") AS StatutMax, Max(QTest_StatusQty_Max.[Qty]) AS ValeurMax
    FROM QTest_StatusQty_Max
    GROUP BY QTest_StatusQty_Max.[Code], QTest_StatusQty_Max.Status;

    Une idée?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/11/2011, 11h24
  2. Réponses: 4
    Dernier message: 28/03/2007, 15h28
  3. calcul de date sur un regroupement de champ en vb
    Par bazilus dans le forum Access
    Réponses: 1
    Dernier message: 06/10/2006, 13h29
  4. Réponses: 2
    Dernier message: 23/08/2006, 16h24
  5. rechercher le max d'un champ sur 2 tables
    Par rdams dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/03/2006, 13h27

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