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 :

Filtrer une table selon conditions [MySQL-8.0]


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 36
    Points : 23
    Points
    23
    Par défaut Filtrer une table selon conditions
    Bonjour à tous,
    Je fais appel à vos lumières pour résoudre un problème, une requête SQL
    Je voudrais créer une nouvelle table à partir d'une table existante (en pièce jointe= biobank_status), sous certaines conditions
    Je dispose donc d'une table contenant des enregistrements (IPP), unique, en doublon et en triplon, voire plus, avec une colonne days_relap (NUM)
    Ma nouvelle table contiendra les enregistrements uniques avec une nouvelle colonne qui m'indiquera "FRRL" si deux enregistrements ou plus avec days_relap inférieur 183 ( occurrence IPP>=2 ET days_relap <=183) OU 3 enregistrements avec days_relap <=365 (occurrence IPP >=3 et days relap <=365) , SINON me retourner "ESP"
    Et une autre colonne qui me retourne le nombre d'occurrence des enregistrements IPP (count)
    Merci par avance de votre aide
    Cordialement
    DE
    Fichiers attachés Fichiers attachés

  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
    Bonjour,

    Qu'as-tu déjà essayé comme requête(s) ?
    Quels résultats as-tu obtenus ?
    - Un message d'erreur ? Lequel ?
    - Un résultat erroné ? Explique pourquoi sous- la forme d'un exemple avec les données en entrée, le résultat de la requête et le résulta attendu.

    PS : Je n'ouvre pas les pièces jointes (et je ne suis pas seul à le faire sur les forums). Si tu souhaites que ton script soit étudié, mets-le dans le message sans oublier de l'encadrer de balises [CODE] et [/CODE].
    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
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 36
    Points : 23
    Points
    23
    Par défaut Filtrer une table selon conditions
    Bonjour al1_24,
    Je suis débutant en mysql, je sais faire des choses basiques, jointure ...
    Voici la table de départ

    Id days_relap
    1 30
    2 40
    3 365
    4 12
    3 180
    4 90
    1 40
    1 400
    5 20
    4 390
    5 3
    5 20

    nouvelle table = résultat

    id occurrence status
    1 3 FRRL
    2 1 ESP
    3 2 ESP
    4 3 FRRL
    5 3 FRRL

    Merci infiniment
    Cordialement
    DE

  4. #4
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2022
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Bonjour DJ2809

    Pour les deux premières colonnes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ALL id AS id, COUNT(id) AS occurrence
    FROM biobank_status
    GROUP BY id
    Pour la troisième, pour l'instant je sèche...

    Bien à toi,

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 36
    Points : 23
    Points
    23
    Par défaut Filtrer une table selon conditions
    Bonjour Autobus77,
    Merci de ce début de réponse. Peut-on peut-être faire appel à la fonction IF () genre quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     SELECT biobank_status
    IF ((COUNT(biobanque_status.Id >=2)) and days_relap <=183) OR (COUNT(biobanque_status.IPP >=3) and days _relap <=365), FRRL, ESP)
    En combinant cela avec ce qu'a proposé autobus77
    Merci de votre aide
    Bonne journée

  6. #6
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2022
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Je ne suis vraiment pas sûr... peut être faudrait-il chercher dans ce sens ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT ALL id AS id, COUNT(id) AS occurrence
    (
    SELECT ALL (*) AS status
    FROM biobank_status
    WHERE ... ...
    )
    FROM biobank_status
    GROUP BY id

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 098
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 098
    Points : 8 207
    Points
    8 207
    Billets dans le blog
    17
    Par défaut
    IF ((COUNT(biobanque_status.Id >=2)) and days_relap <=183) OR (COUNT(biobanque_status.IPP >=3) and days _relap <=365), FRRL, ESP)
    Quels sont tes critères de calcul ? Tes COUNT() m'ont l'air louches.

    Dans le principe tu pourrais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO nouvelle_table (id, occurence, status)
    SELECT ALL
        Id, COUNT(*),
        CASE 
            WHEN <condition-1> AND SUM(days_relap) <= 183 THEN 'FRRL'
            WHEN <condition-2> AND SUM(days_relap) <= 365 THEN 'FRRL'
            ELSE 'ESP'
        END
    FROM biobank_status
    GROUP BY Id
    (Pour plus de lisibilité je sépare les différentes conditions donnant un même résultat "FRRL")

    Reste à voir les règles de calcul à placer dans <condition-1> et <condition-2>.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  8. #8
    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
    Voici une solution basée sur des CTE, à remplacer par des tables dérivées si votre version MySQL est antérieure à la V8 :

    Code SQL : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    with tab1(Id, days_relap) as
        (select 1, 030   union all
         select 2, 040   union all
         select 3, 365   union all
         select 4, 012   union all
         select 3, 180   union all
         select 4, 090   union all
         select 1, 040   union all
         select 1, 400   union all
         select 5, 020   union all
         select 4, 390   union all
         select 5, 003   union all
         select 5, 020
        )
       , tab2(Id, Nb, N183, N365) as
       (select Id 
             , count(*)
             , sum(case when days_relap < 184 then 1 else 0 end)
             , sum(case when days_relap < 366 then 1 else 0 end)
        from tab1
        group by Id
        order by Id
       )
    select Id
         , Nb
         , case when N183 > 1 then 'FRRL'
                when N365 > 2 then 'FRRL'
                else 'ESP'
           end as status
    from tab2


    Résultat :

    Id Nb status
    1 3 FRRL
    2 1 ESP
    3 2 ESP
    4 3 FRRL
    5 3 FRRL

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 36
    Points : 23
    Points
    23
    Par défaut Filtrer une table selon conditions
    Bonjour à tous,bonjour Seb,
    Merci infiniment d'avoir pris le temps d'y réfléchir. Ta proposition est synthétique et me semble intuitive à appréhender.. Cela étant tout fonctionne sauf la <condition 1> et <condition2> qui n'est pas prise en compte. comme si FRRL et ESP sont dépendent seulement de la condition >=183 et >=365 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO nouvelle_table (id, occurence, status)
    SELECT ALL
        Id, COUNT(*),
        CASE 
            WHEN biobank_Id >=2 AND SUM(days_relap) <= 183 THEN 'FRRL'
            WHEN biobank_Id >=3 AND SUM(days_relap) <= 365 THEN 'FRRL'
            ELSE 'ESP'
        END
    FROM biobank_status
    GROUP BY Id
    Si j'ai 2 occurrences ou plus (2 Id identiques ou plus) ET qui sont inférieurs à 183 me retourner FRRL sinon ESP
    Si j'ai 3 occurrences ou plus (3 Id identiques ou plus) ET qui sont inférieurs à 365 me retourner FRRL sinon ESP
    Dans la variable status (colonne status) il faut compter les occurrences et vérifier s'ils sont inférieurs à 183 ou 365
    Dans la variable occurrence (colonne occurrence) retourner juste le nombre d'occurrence
    Je ne sais si vous avez une idée ou une suggestion qui s'articule autour de ça
    Merci beaucoup

  10. #10
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2022
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2022
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Whaou escartefigue !

    J'étais à l'ouest désolé DJ2809

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 36
    Points : 23
    Points
    23
    Par défaut Filtrer une table selon conditions
    J'ai trouvé ce qui manquait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO biobank_status2 (ID, occurrences, status) SELECT IPP, COUNT(*), CASE WHEN COUNT(ID)>=2 AND days_relap <= 183 THEN 'FRRL' WHEN COUNT(ID)>=3 AND days_relap <= 365 THEN 'FRRL' ELSE 'ESP' END FROM biobank_status GROUP BY ID;
    Je tiens sincèrement à vous en remercier vous êtes au TOP
    Merci bcp Seb
    Bonne fin de journée
    DE

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

Discussions similaires

  1. [MySQL-5.7] Afficher colonne d'une table selon condition
    Par TigerCX dans le forum Requêtes
    Réponses: 3
    Dernier message: 27/03/2019, 13h36
  2. [AC-2013] Filtrer une table selon une sélection par Checkbox
    Par maximeAA dans le forum VBA Access
    Réponses: 36
    Dernier message: 15/09/2018, 01h03
  3. Transfert vers une table selon condition
    Par Monsieur Peck dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 13/06/2006, 13h34
  4. [VB.net] Générer une date selon condition
    Par WriteLN dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/10/2005, 16h12
  5. comment filtrer une table avec deux criteres càd 2 colonnes
    Par athmane2dz dans le forum Bases de données
    Réponses: 7
    Dernier message: 28/07/2004, 15h25

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