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 :

Clause SELECT dans un CASE <champ> WHEN <valeur ou condition> THEN <requête SELECT>


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 74
    Points : 54
    Points
    54
    Par défaut Clause SELECT dans un CASE <champ> WHEN <valeur ou condition> THEN <requête SELECT>
    Bonjour à tous,
    Je travaille sur un projet consistant à créer un ED (Entrepot de données) avec l'ETL Talend. J'utilise WAMP Server et je bloque sur une requête SQL consistant à compter le nombre de tests faits sur un élément et le nombre d'occurence de cet élément dans la table.
    Voici mes tables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
    name(id_bacteria, name)
    eventbacteria(id_antibiogram, id_bacteria,nb_test,frequency)
    antibiogram(id_antibiogram)
    bilan(id_bilan)
    eventresult(id_bilan, id_antibiogram, id_test,result)
    test(id_test, antibiotic)
    
    name contient la liste des bactéries contenue dans une BD
    eventbacteria est une table des faits
    antibiogram contient l'identifiant de la série de tests effectué sur un id_bacteria (sur une bactérie)
    eventresult table des faits
    test contient la liste des antibiotiques testés sur une bactérie

    A un id_antibiogram (unique) on associe un et un seul id_bacteria sur leqquel on test 1..n id_test.

    Ce que je voudrais c'est dans mon champ nb_test de eventbacteria compter tous les id_test rattachés au même id_antibiogram

    J'ai testé le code suivant mais ça passe pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT eventbacteria.id_antibiogram
    CASE eventbacteria.id_bacteria 
    WHEN 'numero' THEN 
      SELECT COUNT(id_test.test)
          FROM test
          WHERE test.id_test = eventresult.id_test
          AND eventresult.id_antibiogram = antibiogram.id_antibiogram
          AND antibiogram.id_antibiogram = eventbacteria.antibiogram
    ELSE '0'
    END
    "NB_TEST"
      
    FROM eventbacteria
    Est il possible d'exécuter un SELECT après un THEN? j'ai vu sur le net qu'en général après le WHEN 'x' THEN SELECT 'y' il écrira y. Je veux exécuter une requête après le THEN. Comment faire?
    D'avance merci...

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Points : 128
    Points
    128
    Par défaut Parenthèse et oubli
    Essaye de mettre ton SELECT rouge entre parenthèse.

    Je n'ai pas vu "eventresult" et "antibiogram" dans les clauses FROM ?!! ...

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 74
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par titfab Voir le message
    Essaye de mettre ton SELECT rouge entre parenthèse.

    Je n'ai pas vu "eventresult" et "antibiogram" dans les clauses FROM ?!! ...
    Elles y sont (j'ai juste oublié de les mettre dans mon exemple, dls).
    J'ai testé entre () ou ' ' ou même " ", j'ai eu une erreur du type "Chaque table dérivié doit avoir ses propres alias". J'ai renommer tous les champs et toutes les tables ça ne change rien.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Je pense que vous vous compliquez la vie pour rien.
    Essayez le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT
        eb.id_antibiogram,
        eb.id_bacteria,
        count(*)
    FROM
        eventbacteria eb
        INNER JOIN eventresult er
          ON er.id_antibiogram = eb.id_antibiogram
        INNER JOIN test te
          ON te.id_test = er.id_test
    GROUP BY
        eb.id_antibiogram,
        eb.id_bacteria

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 74
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Je pense que vous vous compliquez la vie pour rien.
    Essayez le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT
        eb.id_antibiogram,
        eb.id_bacteria,
        count(*)
    FROM
        eventbacteria eb
        INNER JOIN eventresult er
          ON er.id_antibiogram = eb.id_antibiogram
        INNER JOIN test te
          ON te.id_test = er.id_test
    GROUP BY
        eb.id_antibiogram,
        eb.id_bacteria
    Merci beaucoup ça marche... (ça me permet de vérifier mes résultats)
    La deuxième étape est la suivante. Comme j'ai dit au début je cherche à chréer un entrepôt de données. Les différentes tables citées plpus haute me permettent de stockées les données que je récupère d'une autre BD.

    Dans cette BD, j'ai une table qui contient des résultats d'examen. Les champs qui m'intéresse sont les suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    examen_result(id_examen, id_serie, libelle, resultat)
    Les résultats de cette table sont de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    id_examen | id_serie | libelle             | resultat
    -------------------------------------------------
    39456        45678     nom_bacterie      bacterie1  
    45678        45678     numération         34
    45324        45678     antibio1             S45
    45678        45678     antibio2             R56
    35536        54367     nom_bacterie      bacterie2
    45634        54367     numération         10000
    12564        54367     antibio1             I
     
    etc...
    Dans mon ETL quand je vais charger les données, je veux que dans ma requête il me fasse ce calcul avant de remplir mon ED.
    Dans ma table eventbacteria je voudrais voir apparaître:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id_antibiogram  id_bacteria  nb_test
    -----------------------------------
    45678             39456         2
    54367             35536         1
    Pour l'instant ma requête est la suivante:
    [CODE]
    SELECT
    examen_result.id_examen, examen_result.id_serie, examen_result.LIBELLE, examen_result.RESULTAT,

    CASE
    examen_result.RESULTAT
    WHEN 'Veillonella spp' THEN 'cocci'
    ELSE
    (CASE
    WHEN examen_result.RESULTAT LIKE 'Achromobacter%' OR examen_result.RESULTAT LIKE 'examen_result%' THEN 'bacilles'
    END)
    END
    "FORM",

    CASE examen_result.RESULTAT
    WHEN 'Veillonella spp' THEN 'Gram -'
    ELSE
    (CASE
    WHEN examen_result.RESULTAT LIKE 'Achromobacter%' OR examen_result.RESULTAT LIKE 'Acinetobacter%' OR examen_result.RESULTAT LIKE 'Aeromonas%' THEN 'Gram -'
    END)
    END
    "GRAM",

    CASE examen_result.LIBELLE
    WHEN 'Veillonella spp' THEN 'Aenaerobie'
    ELSE
    (CASE
    WHEN examen_result.RESULTAT LIKE 'Staphylococcus%' OR examen_result.RESULTAT LIKE 'Streptococcus%' OR examen_result.RESULTAT LIKE 'Enterococcus%' THEN 'Aerobie'
    END)
    END
    "MODE",

    CASE examen_result.RESULTAT
    WHEN 'Veillonella spp' THEN
    (SELECT count(obs1.id_examen)
    FROM examen_result obs1
    WHERE obs1.id_serie= (SELECT obs2.id_serie
    FROM examen_result obs2
    WHERE obs2.resultat = "Veillonella spp")
    AND obs1.resultat NOT LIKE ':/%'
    AND obs1.resultat NOT LIKE 'Veillonella%'
    )
    ELSE (CASE WHEN examen_result.RESULTAT LIKE 'Achromobacter %' THEN
    (SELECT count(obs1.id_examen)
    FROM examen_result obs1
    WHERE obs1.id_serie= (SELECT obs2.id_serie
    FROM examen_result obs2
    WHERE obs2.resultat LIKE 'Achromob%')
    AND obs1.resultat NOT LIKE ':/%'
    AND obs1.resultat NOT LIKE 'Achromobacter%'
    )
    etc....
    END)
    END
    "NB_TEST"

    FROM examen_result
    WHERE examen_result.libelle LIKE 'nom_bacterie'
    [CODE]

    P.S: Ne faites pas attention à la casse des champs des tables, ils sont les mêmes dans ma requête (tout en majuscule ou minuscule)

    C'est la partie en rouge qui me pose pb!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     MySQL a répondu:Documentation
    #1242 - Subquery returns more than 1 row 
    Merci titfab J'ai revérifié avec les () après THEN et ça passe. J'avais certainement une autre erreur qui trainait... Merci

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Points : 128
    Points
    128
    Par défaut Select dans un WHERE
    On peut pas mettre de truc du genre "Where titi=(SELECT ...)"
    Ca doit être "titi Where IN (SELECT ...)

    En corrigeant :

    Code : 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
     
    ...
    CASE examen_result.RESULTAT
    WHEN 'Veillonella spp' THEN 
    (SELECT count(obs1.id_examen) 
    FROM examen_result obs1
    WHERE obs1.id_serie IN (SELECT obs2.id_serie 
    FROM examen_result obs2 
    WHERE obs2.resultat = "Veillonella spp")
    AND obs1.resultat NOT LIKE ':/%'
    AND obs1.resultat NOT LIKE 'Veillonella%'
    )
    ELSE (CASE WHEN examen_result.RESULTAT LIKE 'Achromobacter %' THEN
    (SELECT count(obs1.id_examen) 
    FROM examen_result obs1
    WHERE obs1.id_serie IN (SELECT obs2.id_serie
    FROM examen_result obs2 
    WHERE obs2.resultat LIKE 'Achromob%')
    AND obs1.resultat NOT LIKE ':/%'
    AND obs1.resultat NOT LIKE 'Achromobacter%'
    )
    etc.... 
    END) 
    END
    "NB_TEST"

Discussions similaires

  1. resultat d'une requête select dans un textbox
    Par ciara dans le forum VB.NET
    Réponses: 6
    Dernier message: 20/09/2009, 19h09
  2. Réponses: 1
    Dernier message: 28/04/2009, 09h57
  3. Réponses: 8
    Dernier message: 18/04/2008, 17h40
  4. récupération des requêtes select dans un log
    Par aemag dans le forum Oracle
    Réponses: 1
    Dernier message: 01/12/2006, 16h16
  5. Requête (select dans select)
    Par zut94 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 03/03/2006, 11h38

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