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

Requêtes MySQL Discussion :

Remplacer null par zéro dans une requête qui effectue une somme


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 247
    Points : 78
    Points
    78
    Par défaut Remplacer null par zéro dans une requête qui effectue une somme
    Bonjour,
    j'effectue une requête qui réalise une somme et cette requête me renvoit null dans certains cas.
    J'aurais aimé qu'elle me renvoie zéro à la place.
    J'ai essayé la fonction coalesce mais le résultat est toujours null.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUM(COALESCE(Quantite,0)) as myTotal FROM maTable WHERE Ligne = 21
    La condition WHERE Ligne = 21 peut ne renvoyer aucune entrée de la table
    Des suggestions ?

    Merci pour votre aide

  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
    S'il n'y a aucune quantité pour la ligne 21, la requête ne retournera NULL. Tu peux ajouter un COALESCE pour la somme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COALESCE(SUM(COALESCE(Quantite,0)),0) AS myTotal 
    FROM maTable 
    WHERE Ligne = 21
    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
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 247
    Points : 78
    Points
    78
    Par défaut
    c'est parfait, je n'aurais jamais trouvé.

    Merci beaucoup

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2018
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2018
    Messages : 20
    Points : 31
    Points
    31
    Par défaut
    super
    Citation Envoyé par CinePhil Voir le message
    S'il n'y a aucune quantité pour la ligne 21, la requête ne retournera NULL. Tu peux ajouter un COALESCE pour la somme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COALESCE(SUM(COALESCE(Quantite,0)),0) AS myTotal 
    FROM maTable 
    WHERE Ligne = 21

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 064
    Points
    19 064
    Par défaut
    Salut à tous.

    Le "coalesce(quantite,0)" à l'intérieur du "sum()" ne vous sert strictement à rien car mysql va tout simplement ignorer la quantité à NULL.

    Citation Envoyé par Enzostar
    c'est parfait, je n'aurais jamais trouvé.
    Votre réponse est surprenante car vous utilisez déjà le "coalesce(quantite,0)" pour transformer un NULL en un 0.
    Sauf que vous vous êtes trompés dans l'application du "coalesce()" par rapport au "sum()".

    Voici un exemple de ce que je vous propose :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`        integer unsigned  not null auto_increment primary key,
      `quantite`  integer               null default null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`quantite`) VALUES
      (25),(12),(default),(44),(32)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+----------+
    | id | quantite |
    +----+----------+
    |  1 |       25 |
    |  2 |       12 |
    |  3 |     NULL |
    |  4 |       44 |
    |  5 |       32 |
    +----+----------+
    --------------
    select  sum(quantite) as quantite
      from  `test`
    --------------
     
    +----------+
    | quantite |
    +----------+
    |      113 |
    +----------+
    --------------
    select  coalesce(sum(quantite),0) as quantite
      from  `test`
    --------------
     
    +----------+
    | quantite |
    +----------+
    |      113 |
    +----------+
    --------------
    select  coalesce(sum(quantite),0) as quantite
      from  `test`
     where  id=3
    --------------
     
    +----------+
    | quantite |
    +----------+
    |        0 |
    +----------+
    --------------
    select  coalesce(sum(quantite),0) as quantite
      from  `test`
     where  id=8
    --------------
     
    +----------+
    | quantite |
    +----------+
    |        0 |
    +----------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    Donc la bonne réponse est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COALESCE(SUM(Quantite),0) as myTotal
    FROM maTable
    WHERE Ligne = 21
    et non celle de CinePhil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COALESCE(SUM(COALESCE(Quantite,0)),0) AS myTotal 
    FROM maTable 
    WHERE Ligne = 21
    qui va imbriquer plusieurs fois la fonction "coalesce()" sans aucune raison.
    Bonjour les performance !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 558
    Points
    38 558
    Billets dans le blog
    9
    Par défaut
    Effectivement, COALESCE sur la colonne à totaliser n'est pas utile, par contre, dans la mesure où cette colonne n'intervient ni comme critère de jointure, ni comme critère de filtrage l'impact sur les perfs est certainement très marginal. A prototyper sur des très fortes volumétrie pour en avoir le cœur net

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/03/2016, 16h22
  2. Réponses: 2
    Dernier message: 19/11/2011, 13h21
  3. Réponses: 2
    Dernier message: 19/08/2011, 10h02
  4. Modifier les NULL par Zéro dans les selections
    Par tarek_ep dans le forum SQL
    Réponses: 1
    Dernier message: 02/06/2011, 10h19
  5. céer une table qui copie une requête
    Par averooès dans le forum VBA Access
    Réponses: 3
    Dernier message: 26/01/2009, 15h27

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