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 :

Requête SQL en mode challenge


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 15
    Points : 11
    Points
    11
    Par défaut Requête SQL en mode challenge
    Bonjour,
    Je vous explique mon contexte :
    j'ai une table identification et une table suivi qui est relié à la table identification par une jointure
    donc :

    TABLE : Visite identification
    ID,asthme(BOOLEAN)
    FIN TABLE

    TABLE : Visite de suivi
    ID,asthme(BOOLEAN),id_identification
    FIN TABLE

    Ce que je veux : le pourcentage de personne qui ont de l'asthme à l'instant ou on exécute la requête.
    Donc je veux que la dernière valeur de l'asthme soit retourné pour chaque personne (une personne correspondant à une ligne dans la table Visite d'identification), sachant que une personne peut avoir plusieurs lignes de visite de suivi.

    Exemple de données :

    TABLE : Visite identification
    1,0
    2,1
    3,1
    ID,asthme(BOOLEAN)
    FIN TABLE

    TABLE : Visite de suivi
    1,1,2
    2,1,2
    3,0,3
    ID,asthme(BOOLEAN),id_identification
    FIN TABLE

    Dans ce cas je veux que ma requête me retourne
    1,0
    2,1
    3,0
    Visite identification.ID,asthme

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Qu'as-tu déjà essayé comme requête ?
    Quel problème rencontres-tu ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    J'ai pensé à regarder si la personne possède une visite de suivi, si c'est le cas récupéré l'asthme pour le max(id) donc quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id,asthme 
    FROM visitesuivi
    GROUP BY id_patient
    HAVING (id = max( id ))
    (ça ne fonctionne pas)

    et après pour fusionner avec les résultats de la table identification j'ai pensé à un UNION mais pour tout te dire, je ne vois vraiment pas par quel bout commencer

  4. #4
    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

    Si votre SGBD (quel est-il ?) implémente les fonctions fenêtrées, vous pouvez faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ;WITH CTE AS (
        SELECT Astme, id_identification, ROW_NUMBER() OVER (PARTITION BY id_identification ORDER BY id DESC) Rn
        FROM VisiteSuivi
    )
    SELECT v.ID, COALESCE(s.asthme, v.asthme) AS asthme
    FROM Visitieidentification v
    LEFT JOIN CTE s
        ON s.id_identification = v.id_identification
        AND Rn = 1

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    C'est un mysql sur un ovh mutualisé la version est marqué : "OVH". Je vais essayé merci.
    Je connaissais pas du tout ce petit (with) bien pratique mais apparement non fonctionnel sur ma version
    check the manual that corresponds to your MySQL server version for the right syntax to use near 'WITH CTE AS

    ça peut permettre de faire de la récursivité ce petit machin mais ça à l'air only microsoft ?

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par su4p aka Voir le message
    ça peut permettre de faire de la récursivité ce petit machin mais ça à l'air only microsoft ?
    C'est défini dans la norme SQL 2003 donc pris en charge par les bons SGBD
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    y a pas de solution saine pour moi ? (par saine j'entends uniquement SQL)

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Mais c'est bien une solution purement SQL qui t'a été proposée...
    Sans doute voulais-tu une solution adaptée au dialecte limité de MySQL ? Mais tu ne l'as pas précisé dans ta demande.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    En effet, mille excuses !

  10. #10
    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 su4p aka Voir le message
    y a pas de solution saine pour moi ? (par saine j'entends uniquement SQL)
    Si, quelque chose comme ceci (pas testé mais le principe est là):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT v.ID, COALESCE(s.asthme, v.asthme) AS asthme
    FROM Visitieidentification v
    LEFT JOIN VisiteSuivi s
        ON s.id_identification = v.id_identification
        AND NOT EXISTS( 
            SELECT 1
            FROM VisiteSuivi s2
            WHERE S2.id_identification = s.id_identification
            AND S2.id > s.id
        )

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Génial, j'ai le résultat attendu avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT v.ID, COALESCE(s.asthme, v.asthme) AS asthme
    FROM Visitieidentification v
    LEFT JOIN VisiteSuivi s
        ON s.id_identification = v.id_identification
        AND NOT EXISTS( 
            SELECT 1
            FROM VisiteSuivi s2
            WHERE S2.id_identification = s.id_identification
            AND S2.id > s.id
        )
    Et en plus j'ai compris ce que tu faisais super !!!! Merci beaucoup.

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

Discussions similaires

  1. Requête sql challenge
    Par voxov dans le forum Langage SQL
    Réponses: 14
    Dernier message: 22/10/2013, 02h25
  2. Requête sql challenge 2
    Par voxov dans le forum Langage SQL
    Réponses: 9
    Dernier message: 09/10/2013, 14h41
  3. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  4. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  5. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/02/2003, 16h44

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