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

Langage SQL Discussion :

Retourner une valeur qui dépend de plusieurs lignes


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut Retourner une valeur qui dépend de plusieurs lignes
    Bonjour,

    voici mon problème:
    j'ai une table qui contient les champs suivants:
    - DATE
    - NOM qui prend valeurs A, B, C ou D
    - ETAT qui prends 0 ou 1

    Je cherche a obtenir la date maxi pour laquelle les valeurs de du champ NOM ont un état égal à 1, c'est à dire que ETAT de A = ETAT de B = ETAT de C = ETAT de D = 1.

    Avez-vous une idée de la démarche à suivre?

    Merci.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Si nNOM ne peut prendre que 4 valeurs, on cherche donc dans un premier temps les dates auxquelles l'état est à 1 pour les 4 valeurs distinctes de nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT colonneDate # éviter d'appeler une colonne 'DATE' c'est un mot réservé SQL
    FROM taTable
    WHERE ETAT = 1
    GROUP BY colonneDate
    HAVING COUNT(DISTINCT NOM) = 4
    Il suffit ensuite de prendre la valeur maxi du résultat de la première requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT MAX(colonneDate) AS DateMax
    FROM (
      SELECT colonneDate
      FROM taTable
      WHERE ETAT = 1
      GROUP BY colonneDate
      HAVING COUNT(DISTINCT NOM) = 4
    ) tmp

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Merci pour ta réponse.
    Par contre comment faire si le nom peut prendre d'autres valeurs...?

  4. #4
    Membre actif Avatar de yroubag
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2004
    Messages : 162
    Points : 224
    Points
    224
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Select NOM, Max(DATE) as DATEMAX
    FROM TABLE1
    WHERE ETAT = 1
    GROUP BY NOM
    Donne la date maximale pour chaque Nom dont l'état est égal à 1.

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Alors dans ce cas il faut d'abord sélectionner les NOMs choisis + MAX(colonneDate) des lignes dont l'état est à 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT NOM, MAX(ColonneDate) AS DateMax
    FROM taTable
    WHERE ETAT = 1 AND NOM IN('A', 'B', 'C', 'D')
    GROUP BY NOM
    Puis ne prendre que le MAX des DateMax ayant les 4 valeurs comme tout à l'heure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT MAX(DateMax) AS DerniereDate
    FROM (
      SELECT NOM, MAX(ColonneDate) AS DateMax
      FROM taTable
      WHERE ETAT = 1 AND NOM IN('A', 'B', 'C', 'D')
      GROUP BY NOM
    ) tmp
    GROUP BY DateMax
    HAVING COUNT(DISTINCT NOM) = 4
    A essayer.

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    C'est bon, j'ai testé l'ajout de la restriction sur les noms dans la clause where, ça marche, merci.

Discussions similaires

  1. [MariaDB] Exécution d'une requête qui doit afficher plusieurs lignes
    Par mrbrams dans le forum MySQL
    Réponses: 0
    Dernier message: 23/12/2014, 09h16
  2. Réponses: 1
    Dernier message: 10/11/2012, 19h28
  3. Réponses: 6
    Dernier message: 19/02/2007, 13h34
  4. Une Form qui retourne une valeur?
    Par say dans le forum C++Builder
    Réponses: 4
    Dernier message: 06/02/2006, 10h05
  5. Réponses: 7
    Dernier message: 26/10/2004, 11h02

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