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

SQL Oracle Discussion :

Spécification d'une colonne en fonction d'un resultat


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Points : 8
    Points
    8
    Par défaut Spécification d'une colonne en fonction d'un resultat
    Bonjour à tous,

    J'utilise fréquement la requete simplifiée ci dessous :

    Select client,
    Max( CASE WHEN ROROLE=1 THEN 'Emetteur a;' ELSE NULL END)||
    Max( CASE WHEN ROROLE=2 THEN ''Emetteur b;' ELSE NULL END)|| ' ' A
    From matable

    Cette requete me permet d'extraire le nom des clients d'une table + de savoir si un client est "Emetteur a" et/ou "Emetteur b" ou rien du tout en alignant le résultat sur 2 colonne

    Sur Excell, l'extraction s'affiche de la manière suivante (3 colonnes différentes):

    Colonne 1 Colonne 2 Colonne 3
    Client1 Emetteur a Emetteur b
    Client2 Emetteur b Emetteur a
    Client3 Emetteur b (cellule vide)

    "Emetteur a" ou "emetteur b" s'affichent indifféremment en colonne 2 ou 3 (je suppose que cela dépend de qui a ou b a été renseigné en 1er en base)

    Existe t il un moyen pour forcer la mise en forme de l'extraction. A savoir :
    - Si un client est ROROLE=1 alors "Emetteur a" s'affiche dans la colonne 2
    - Si un client n'est pas ROROLE=1 alors la colonne 2 est vide
    - Si un client est ROROLE=2 alors "Emetteur b" s'affiche dans la colonne 3
    - Si un client n'est pas ROROLE=2 alors la colonne 3 est vide

    MERCI d'avance pour votre retour

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Au lieu de NULL, mettez un espace.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Oui vous pouvez, au lieu de faire une concaténation il suffit de définir une colonne supplémentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      select client,
             max(case rorole when 1 then 'Emetteur a' end) as colonne2
             max(case rorole when 2 then 'Emetteur b' end) as colonne3
        from matable
    group by client

  4. #4
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Points : 8
    Points
    8
    Par défaut Spécification d'une colonne en fonction d'un résultat
    Merci pour vos 2 réponses.

    Voici la requete que j'ai faite suite à vos 2 réponses (rotiers correspond à clients du message précédent) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select rotiers,rorole,
    	max (case rorole when 1 then 'Emeteur a' end) as colonne2
    	max (case rorole when 2 then Emeteur b' end) as colonne3
    from x.rolestiers
    Group by rotiers;
    Voici le message que me donne l'extraction :
    ORA-01756: quoted string not properly terminated

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Citation Envoyé par Jackola Voir le message
    Merci pour vos 2 réponses.

    Voici la requete que j'ai faite suite à vos 2 réponses (rotiers correspond à clients du message précédent) :

    select rotiers,rorole,
    max (case rorole when 1 then 'Emeteur a' end) as colonne2
    max (case rorole when 2 then Emeteur b' end) as colonne3
    from x.rolestiers
    Group by rotiers
    ;

    Voici le message que me donne l'extraction :
    ORA-01756: quoted string not properly terminated
    Il manque une apostrophe devant "Emeteur b" dans votre script.

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    oops, désolé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select rotiers,rorole,
    	max(case rorole when 1 then 'Emeteur a' end) as colonne2
    	max(case rorole when 2 then 'Emeteur b' end) as colonne3
    from exane.rolestiers
    Group by rotiers
    ;
    Maintenant le message est le suivant :

    max(case rorole when 2 then 'Emeteur b' end) as colonne3
    *
    ERROR at line 3:
    ORA-00923: FROM keyword not found where expected

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Maintenant, il manque une virgule après colonne2...

  8. #8
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Enorme merci à vous 2.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ca m'étonnerait que votre requête fonctionne en l'état, il vous faut soit un aggrégat sur rorole, soit qu'il ne soit pas présent dans la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      SELECT rotiers,
             max(case rorole when 1 then 'Emetteur a' end) AS colonne2,
             max(case rorole when 2 then 'Emetteur b' end) AS colonne3
        FROM x.rolestiers
    GROUP BY rotiers;
    Ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SELECT rotiers,
             max(rorole) AS rorole_max,
             max(case rorole when 1 then 'Emetteur a' end) AS colonne2,
             max(case rorole when 2 then 'Emetteur b' end) AS colonne3
        FROM x.rolestiers
    GROUP BY rotiers;

  10. #10
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Points : 8
    Points
    8
    Par défaut Spécification d'une colonne en fonction d'un resultat
    Bonjour à tous,

    1 / Je souhaiterai rajouter une valeur qui dépend d'une condition dans une 4ème colonne :

    Si 'emetteur a' apparait en colonne 2 alors la colonne 4 contient la valeur 'TP'.
    Sinon 'TS'

    2 / Je souhaite ensuite filtrer le résultat de la requête : ne garder que les lignes avec 'TP' en colonne 4.

    Ci dessous mon code pour la partie 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SELECT rotiers,
             max(case rorole when 1 then 'Emetteur a' end) AS colonne2,
             max(case rorole when 2 then 'Emetteur b' end) AS colonne3,
             min(case when rorole=1 then 'TP' else 'TS' end) as colonne4
        FROM x.rolestiers
    GROUP BY rotiers;
    Je bute sur la partie 2.

    Merci d'avance pour votre aide.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Points : 388
    Points
    388
    Par défaut
    bonjour,
    pourquoi ne pas ajouter dans la clause where un test sur rorole
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      SELECT rotiers,
             max(case rorole when 1 then 'Emetteur a' end) AS colonne2,
             max(case rorole when 2 then 'Emetteur b' end) AS colonne3,
             min(case when rorole=1 then 'TP' else 'TS' end) AS colonne4
        FROM x.rolestiers
        WHERE rorole=1
    GROUP BY rotiers;
    sinon il faut utiliser HAVING
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      SELECT rotiers,
             max(case rorole when 1 then 'Emetteur a' end) AS colonne2,
             max(case rorole when 2 then 'Emetteur b' end) AS colonne3,
             min(case when rorole=1 then 'TP' else 'TS' end) AS colonne4
        FROM x.rolestiers
    GROUP BY rotiers
    HAVING min(case when rorole=1 then 'TP' else 'TS' end)='TP';

  12. #12
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    J'opte pour le Having!!

    Merci beaucoup

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 07/05/2009, 16h41
  2. Somme d'une colonne en fonction d'une autre
    Par j.mathieu dans le forum Excel
    Réponses: 6
    Dernier message: 16/08/2008, 14h55
  3. Réponses: 6
    Dernier message: 18/12/2007, 06h36
  4. somme de valeurs d'une colonne en fonction d'autres colonnes
    Par youness78 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 02/08/2007, 19h31
  5. Contraite NULL sur une colonne en fonction d'une autre colon
    Par speedy1496 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2004, 19h29

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