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

Développement SQL Server Discussion :

CASE <champ> WHEN NULL ? [Fait]


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut CASE <champ> WHEN NULL ?
    Bonjour,

    Dans une requête, j'ai un SELECT sur lequel je fais un CASE ... WHEN .. END
    Je cherche à rechercher le cas où la valeur du champ est NULL, je fais alors :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT
      ID_ARTICLE,
      SUM(CASE ENVOI WHEN 1 THEN 1 ELSE 0 END) AS NBOK, -- Nombre d'envois OK
      SUM(CASE ENVOI WHEN 0 THEN 1 ELSE 0 END) AS NBKO, -- Nombre d'envois KO
      SUM(BASE ENVOI WHEN NULL THEN 1 ELSE 0 END) AS NBENCOURS -- Nombre d'envois en cours
    FROM
      MAILS_ENVOIS
    GROUP BY
      ID_ARTICLE
    Mais ça ne fonctionne pas. Comment faire ?

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
    ID_ARTICLE,
    SUM(CASE ENVOI WHEN 1 THEN 1 ELSE 0 END) AS NBOK, -- Nombre d'envois OK
    SUM(CASE ENVOI WHEN 0 THEN 1 ELSE 0 END) AS NBKO, -- Nombre d'envois KO
    SUM(CASE WHEN ENVOI IS NULL THEN 1 ELSE 0 END) AS NBENCOURS -- Nombre d'envois en cours
    FROM
    MAILS_ENVOIS
    GROUP BY
    ID_ARTICLE
    J'ai pas pu tester mais une petite erreur de frappe déjà sur le dernier CASE
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  3. #3
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Merci, ça fonctionne. je ne savais pas qu'on pouvais faire CASE WHEN ... sans rien mettre entre case et when :S
    Merci

  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Alors cela signifie que tu ne regarde pas assez les tutos

    Ici tout est expliqué !

    Bonne journée et bonne lecture
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  5. #5
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Je viens de regardé les tutos. Il est dit qu'il faut éviter d'utiliser au maximum les SELECT..CASE et autre IF
    Voici 2 requêtes ramenant toutes les deux les mêmes résultats. Une utilise des jointures et l'autre un SELECT..CASE. D'après le tuto, il faudrait donc mieux que j'utilise celle faisant des jointures ?


    Avec jointure
    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
     
    SELECT
    	dbo.MAILS_ENVOIS.ID_ARTICLE, 
    	COUNT(*) AS NBDEST, 
    	COUNT(M1.mailitem_id) AS NBENVOIS,
    	COUNT(M2.mailitem_id) AS NBENCOURS,
    	COUNT(M3.mailitem_id) AS NBECHEC
    FROM         
    	dbo.STRIKE 
            INNER JOIN dbo.MAILS_ENVOIS ON dbo.STRIKE.ID = dbo.MAILS_ENVOIS.IDSTRIKE
    	LEFT JOIN msdb.dbo.sysmail_sentitems M1 ON M1.mailitem_id = dbo.MAILS_ENVOIS.IDMAIL
            LEFT JOIN msdb.dbo.sysmail_unsentitems M2 ON M2.mailitem_id = dbo.MAILS_ENVOIS.IDMAIL
            LEFT JOIN msdb.dbo.sysmail_faileditems M3 ON M3.mailitem_id = dbo.MAILS_ENVOIS.IDMAIL
    WHERE 
    	IDMAIL IS NOT NULL
    GROUP BY 
    	dbo.MAILS_ENVOIS.ID_ARTICLE

    Sans jointure
    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
     
    SELECT
    	dbo.MAILS_ENVOIS.IDSTRIKE, 
    	COUNT(*) AS NBDEST, 
    	SUM(CASE M1.sent_status WHEN 'sent' THEN 1 ELSE 0 END) AS NBENVOIS,
    	SUM(CASE M1.sent_status WHEN 'unsent' THEN 1 ELSE 0 END) AS NBENCOURS,
    	SUM(CASE M1.sent_status WHEN 'failed' THEN 1 ELSE 0 END) AS NBECHEC
    FROM         
    	dbo.STRIKE 
            INNER JOIN dbo.MAILS_ENVOIS ON dbo.STRIKE.ID = dbo.MAILS_ENVOIS.IDSTRIKE
    	LEFT JOIN msdb.dbo.sysmail_allitems M1 ON M1.mailitem_id = dbo.MAILS_ENVOIS.IDMAIL
    WHERE 
    	IDMAIL IS NOT NULL
    GROUP BY 
    	dbo.MAILS_ENVOIS.IDSTRIKE

    PS : sysmail_sentitems, sysmail_unsentitems et sysmail_faileditems sont des vues ayant la même structure que la table sysmail_allitems. Elles filtrent simplement les résultats selon le champ sent_status ('sent', 'unsent' et 'failed')

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

Discussions similaires

  1. [CR] Ne pas afficher un champ de valeur nulle
    Par mavericks dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 28/03/2007, 17h06
  2. [PL/SQL] CASE xxx WHEN NULL
    Par Loko dans le forum Oracle
    Réponses: 5
    Dernier message: 06/12/2004, 11h40
  3. [CR 9] Mise en forme non affichée when null
    Par Yorglaa dans le forum Formules
    Réponses: 2
    Dernier message: 28/06/2004, 18h27
  4. Selectionner un champ de valeur nulle
    Par arcane dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/09/2003, 15h26
  5. [VB6] [BDD] Recordset et champ égal à Null
    Par Gr|ppen dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/03/2003, 11h00

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