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 :

Utiliser un case when else end entre 2 colonnes


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    358
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 358
    Points : 77
    Points
    77
    Par défaut Utiliser un case when else end entre 2 colonnes
    Bonjour,

    Je cherche à ne pas afficher de valeurs dans une colonne en fonction du résultat d'une autre valeur dans une autre colonne.

    Je m'explique: je cherche à afficher le statut de commandes (envoyée: OUI ou NON) ainsi que la date d'envoi dans la colonne d'à côté.
    Le problème est que la date d'envoi (provenant d'une autre table) est indiquée même si le statut de la commande est à NON.

    Mon idée avait été d'utiliser la fonction case when... mais après plusieurs tentatives infructueuses, je n'arrive toujours pas à afficher ce que je souhaite:

    ENVOYE DATE_ENVOI
    OUI 22/01/2018
    NON

    Ma requête se présente grosso-modo comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select NUM_CDE, ENVOYE, DATE_ENVOI  
    from T_STATUT, T_DATE
    where T_STATUT.NUM_CDE = T_DATE.NUM_CDE
    Est-ce que quelqu'un aurait une idée de la syntaxe à employer pour que plus aucune date d'envoi ne s'affiche lorsque le statut est à NON ?

    Merci.
    Microsoft SQL Server Management Studio v17.9.1

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    1) Les jointures s'écrivent depuis 1992 avec l'opérateur JOIN ; il serait temps de s'y mettre !

    2) Si la commande n'a pas été envoyée, il ne devrait pas y avoir de date d'envoi dans T_DATE, non ?
    Au passage, bizarre d'appeler ça T_DATE qui fait plutôt penser à une table contenant toutes les dates d'un calendrier à des fins de planning ou calculs sur des périodes !
    De même que T_STATUT fait plutôt penser à une table de référence des différents statuts possibles.
    Votre base de données ne concerne strictement que les commandes ?

    Si la réponse à ma première question est oui, alors il vous faut une jointure externe.

    3) L'utilisation d'alias pour les tables est fortement recommandé dès qu'il y a plus d'une table dans la requête. Cela facilite l'écriture et la lecture de celle-ci. Il faut ensuite utiliser systématiquement ces alias devant chaque colonne nommée pour savoir facilement de quelle table elle vient.
    Dans votre requête select NUM_CDE devrait donner un message d'ambiguïté puisque la colonne NUM_CDE semble être présente dans les deux tables de la requête puisque c'est la condition de jointure.
    On suppose que ENVOYE est dans la table T_STATUT et DATE_ENVOI est dans la table T_DATE ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    358
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 358
    Points : 77
    Points
    77
    Par défaut
    Merci pour le rappel à l'ordre mais n’ayant pas de grandes connaissances en sql (j'ai appris sur le tas, par un collègue qui m'a expliqué au plus simple), j'utilise effectivement toujours le système = au lieu de JOIN...

    Ma requête étant bien plus longue et contenant des noms de tables et schémas difficilement diffusables sur un forum, j'ai donc écrit une version simplifiée en oubliant d'y ajouter les alias de tables:
    Cela donne donc effectivement plutôt quelque chose dans ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select T_STATUT.NUM_CDE, T_STATUT.ENVOYE, T_DATE.DATE_ENVOI  
    from T_STATUT, T_DATE
    where T_STATUT.NUM_CDE = T_DATE.NUM_CDE
    Et effectivement, la structure des 2 tables est différente (on ne peut rien vous cacher): la table que j'appelle T_STATUT comporte l'intégralité des contacts d'une commande alors que la table que j'appelle T_DATE contient une sorte de "résumé" d'informations inhérentes à une commande (1 ligne = 1 commande).
    Le problème étant pour moi que dans une commande, une partie peut avoir été envoyée et pas l'autre (pour diverses raisons de rejets, etc...) mais la table T_DATE fait apparaître une date d'envoi du moment qu'un seul contact d'une commande ait été envoyé.
    C'est pour cette raison qu'il faudrait que je puisse ne pas faire apparaître ladite date d'envoi pour les volumes non envoyés.

    J'espère vous avoir apporté des éclaircissements quant à ma demande...
    Microsoft SQL Server Management Studio v17.9.1

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    OK, donc puisque dans T_DATE il y a une ligne par commande, pas de jointure externe vers cette table.

    Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select T_STATUT.NUM_CDE, T_STATUT.ENVOYE, 
    	CASE
    		WHEN T_STATUT.ENVOYE = 'OUI' THEN T_DATE.DATE_ENVOI
    		ELSE NULL
    	END
    from T_STATUT
    INNER JOIN T_DATE ON T_STATUT.NUM_CDE = T_DATE.NUM_CDE
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    358
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 358
    Points : 77
    Points
    77
    Par défaut
    Merci beaucoup, cela fonctionne parfaitement !
    Microsoft SQL Server Management Studio v17.9.1

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

Discussions similaires

  1. [2012] Utilisation de la clause WHERE CASE WHEN ELSE END dans une procédure stockée
    Par djelloharmel dans le forum Développement
    Réponses: 5
    Dernier message: 23/09/2015, 19h36
  2. Utilisation de 'case when'
    Par pfelelep59 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/12/2012, 21h46
  3. Utilisation du Case When
    Par devalender dans le forum SQL
    Réponses: 2
    Dernier message: 21/11/2011, 19h13
  4. Utilisation de case when avec une sous requête
    Par gtraxx dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/03/2011, 16h44
  5. Requete CASE WHEN ELSE
    Par Bendir dans le forum SQL
    Réponses: 3
    Dernier message: 07/07/2009, 14h01

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