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 :

Requete select CASE WHEN COUNT


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 7
    Points
    7
    Par défaut Requete select CASE WHEN COUNT
    Bonjour à tous,

    J'ai une table A présenté de la façon suivante :
    numero | offre
    --------------
    1 | S
    1 | S
    2 | S
    3 | S


    je souhaite récupérer les numeros et les offres mais s'il y a plusieurs offres je met NC a la place de l'offre.
    résultat de mon select que je souhaite avoir:
    numero | offre
    --------------
    1 | NC
    2 | S
    3 | S

    Comment faire ? je pensais utiliser un CASE WHEN COUNT(*) mais ca ne fonctionne pas.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 262
    Points : 12 936
    Points
    12 936
    Par défaut
    Bonjour,
    Il y a peut-être plus élégant, mais on peut le faire avec une sous-requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select numero,(case when nombre = 1 then offre else 'NC' end)
    from
    (
    select numero,offre,count(*) as nombre
    from LaTable
    group by numero,offre
    )

    Tatayo.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    La requête ne fonctionne pas..

    J'avais pensé à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select numero,
    case WHEN COUNT(*) > 1 THEN 'NC' 
    	ELSE MAX(offre)
    	END AS offre from A
    mais ne fonctionne pas

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    ca ne fonctionne pas, ne veut strictement rien dire.

    La requête donnée par tatayo est bonne, votre approche aussi.


    Décrivez mieux le problème rencontré.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Si je prends ma requête, il me donne les résultats :
    1 | S
    2 | S
    3 | S

    au lieu de
    1 | NC
    2 | S
    3 | S

    Concernant la requête de tatayo, j'ai l'erreur : syntax error expected something like a name or a unicode delimited identifier or an UDFCALLNAME keyword between )' and ';'

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    with tmp as (
    select 1 as numero, 'S' as offre from dual union all
    select 1 as numero, 'S' as offre from dual union all
    select 2 as numero, 'S' as offre from dual union all
    select 3 as numero, 'S' as offre from dual)
    select numero, case when count(*) > 1 then 'NC' else max(offre) end
    from tmp
    group by numero

    Sinon, pour la requete tatayo votre sgbd demande simplement de mettre un alias à la sous-requete je suppose.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Merci mais je ne peux pas appliquer cette requête car j'ai des milliers de lignes avec des numéros et offres différentes.

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Et pourquoi donc ?

    Que ne comprenez-vous pas dans les exemples donnés ?

    Ils sont applicables à d'autre contexte et surtout modifiable.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Car si j'ai 1000 numéros, je ne vais pas mettre 1000lignes dans ma requete de la osrte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH tmp AS (
    SELECT 1 AS numero, 'S' AS offre FROM dual union ALL
    SELECT 1 AS numero, 'S' AS offre FROM dual union ALL
    SELECT 2 AS numero, 'S' AS offre FROM dual union ALL
    SELECT 3 AS numero, 'S' AS offre FROM dual
    ...
    ...
    ...
    SELECT 1000 AS numero, 'S' AS offre FROM dual)
    SELECT numero, case when count(*) > 1 then 'NC' else max(offre) end
    FROM tmp
    GROUP BY numero

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bah dégagez la partit WITH tmp ..., et mettez le nom de votre table dans la clause FROM.


    Il y a de très bon tutoriel de SQL sur se site, n'hésitez pas
    http://sqlpro.developpez.com/ => Initiation à SQL (dans les menus à gauche de l'écran)

  11. #11
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    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 109
    Points : 28 437
    Points
    28 437
    Par défaut
    La portion de code WITH tmp AS (SELECT 1 ...FROM dual) n'est là que pour créer le jeu d'essai.
    La requête ne commence qu'à la ligne suivante...

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Ca fonctionne merci

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

Discussions similaires

  1. CASE WHEN + COUNT
    Par nicerico dans le forum MySQL
    Réponses: 5
    Dernier message: 24/03/2009, 06h58
  2. pb SELECT CASE WHEN
    Par bb5477 dans le forum SQL
    Réponses: 2
    Dernier message: 18/12/2007, 17h16
  3. Access et SELECT CASE WHEN dans requetes
    Par Orion01 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 06/12/2007, 11h24
  4. Réponses: 7
    Dernier message: 29/05/2007, 10h21
  5. Equivalent "Select Case when then else end" sur Paradoxe
    Par Seuh.m dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/06/2006, 08h23

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