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 averti
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    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 814
    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
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

  4. #4
    Invité
    Invité(e)
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    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 814
    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.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    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