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 :

Afficher les valeurs "NULL" dans une colonne créée ? [MySQL-8.0]


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2022
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Afficher les valeurs "NULL" dans une colonne créée ?
    Hello,

    Je débute dans MySQL mais je ne trouve pas trop d'infos pour mon problème, tout ce que je trouve est pour afficher les colonnes qui ont des valeurs null mais ça n'est pas ce que je souhaite. Pour résumer : je cherche à classer la somme des ventes, par mois, selon des catégories de produits (7 au total) pour les 12 derniers mois quel que soit le moment de ma requête. Pour cela je dois créer une colonne "mois" et une colonne "total_ventes". Dans l'extraction, j'ai bien mon résultat, mais j'aimerai que pour chaque mois, les 7 catégories soient visibles avec des "null" dans a colonne total_ventes quand il y en a pas.

    J'ai l'impression que quand on créé des colonnes, faire un LEFT JOIN ou RIGHT JOIN ne permet pas de faire fonctionner cela.

    Je précise que je n'ai pas le droit de modifier la base de données (ajouter des clés primaires/étrangères pour lier des tables), je peux juste créer des tableaux sans aucun lien qui pourront me servir d'extract.

    Voici mon code et des captures d'écran si ça peut aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT p.productLine, date_format(o.orderDate, "%M") AS mois, SUM(od.quantityOrdered * od.priceEach) as total_ventes 
    FROM products AS p
    LEFT JOIN orderDetails AS od ON p.productCode = od.productCode
    LEFT JOIN orders AS o ON od.orderNumber = o.orderNUmber
    WHERE o.orderDate BETWEEN DATE_ADD(NOW(), INTERVAL - 12 MONTH) AND NOW()
    GROUP BY p.productLine, MONTH(o.orderDate)
    ORDER BY o.orderDate DESC;

    Résultat obtenu :

    Nom : 1.JPG
Affichages : 55
Taille : 30,5 Ko


    Diagramme de la base de données :

    Nom : 2.JPG
Affichages : 53
Taille : 168,6 Ko



    Je ne cherche pas forcément la solution toute faite, mais plus le chemin pour y parvenir afin que je me débrouille dans la démarche.

    Merci par avance si vous avez des idées !

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

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 966
    Points : 12 075
    Points
    12 075
    Par défaut
    Bonjour,
    Tu as mis une condition sur la table orders dans la clause WHERE, ce qui transforme la jointure externe en jointure interne.
    Il faut mettre la condition dans la jointure.

    Tatayo.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2022
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci pour ce retour, mais je ne comprends pas le pourquoi du comment car quand je fais cela, j'ai un résultat étrange. Voici le code avec cette fois la condition dans la jointure externe (je l'ai modifiée un peu car je veux que ça prenne 12 mois stricts à compter du dernier jour du mois dernier) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT p.productLine, date_format(o.orderDate, "%M") as mois, SUM(od.quantityOrdered * od.priceEach) as total_ventes
    FROM products AS p
    LEFT JOIN orderDetails AS od ON p.productCode = od.productCode 
    LEFT JOIN orders AS o ON od.orderNumber = o.orderNUmber AND o.orderDate BETWEEN DATE_ADD(NOW(), INTERVAL - 12 MONTH) AND DATE_ADD(NOW(), INTERVAL - DAYOFMONTH(NOW()) DAY)
    GROUP BY p.productLine, MONTH(o.orderDate)
    ORDER BY o.orderDate DESC;
    J'ai le même résultat à la différence que quand je vais tout en bas du tableau, j'ai une incohérence :


    Nom : 3.JPG
Affichages : 43
Taille : 44,0 Ko


    L'idée serait d'afficher un résultat de ce type :

    Nom : 4.JPG
Affichages : 43
Taille : 25,4 Ko


    J'avoue ne pas comprendre pourquoi il me met bien une colonne null pour chaque catégorie mais avec des montants pour les total_ventes

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

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 966
    Points : 12 075
    Points
    12 075
    Par défaut
    Gelouas: c'est tout à fait normal ici.
    La mois est récupéré de la date de la commande.
    Or comme tu pars du produit, et que tu fais une jointure externe sur la commande, quand il n'y a pas de commande, il n'y a pas de date.

    Pour gérer ce genre de requête le mieux est d'avoir une table calendrier.
    SqlPro nous a fourni un script complet pour créer ce calendrier.
    Un autre exemple "plus simple" .

    Il suffira ainsi de partir de cette table, et de chercher les éventuelles commandes. Ainsi commande ou pas tu auras toujours tous les mois dans le résultat.

    Tatayo.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2022
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci pour ton retour.

    Je me garde de côté la solution table calendrier, je suis en train d'en essayer une mais c'est pareil je dois passer à côté de quelque chose je pense.

    Comme je dois avoir 7 catégorie par mois, j'ai créé une table qui contient ces éléments (nom : base) :

    Nom : 5.JPG
Affichages : 30
Taille : 26,5 Ko

    J'ai également créé une vue (CREATE VIEW) qui contient les résultats de ma requête voulue (nom : annee_2021) :

    Nom : 1.JPG
Affichages : 32
Taille : 27,8 Ko

    Je me dis que comme je veux des "NULL" sur la partie de droite (la CREATE VIEW) au dessus, je dois juste faire un LEFT JOIN sur mon tableau contenant toutes les catégories :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT b.monthnum, a.productline, a.total_ventes
    FROM base as b
    LEFT JOIN annee_2021 as a ON b.monthnum = a.mois
    GROUP BY b.monthnum,a.productline;
    Le résultat est strictement le même :

    Nom : 6.JPG
Affichages : 30
Taille : 38,1 Ko


    Si le fait que ça ne fonctionne pas est logique je vais regarder pour la solution avec calendrier, mais je ne comprends pas pourquoi ça ne fonctionne pas : peut-être parce que je lie une table à une view ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 966
    Points : 12 075
    Points
    12 075
    Par défaut
    Tu peux sans aucun problème faire une jointure entre des tables, des vues, des CTE...

    Dans ton exemple, si tu ajoutes dans la table base des lignes avec des mois pour lesquelles tu n'as pas de commande, tu devrais retrouver des null dans le résultat de la requête.
    Accessoirement, tu as mis dans la table base le mois et la "liste de produit", 2 données qui se trouvent aussi dans ta vue.
    Or tu ne fais la jointure que sur le mois, ce qui n'est pas cohérent.
    D'ailleurs en voyant les données que tu nous exposes, si tu fais la jointure sur les deux colonnes tu devrais avoir une ligne sans commande pour le couple "August/Trains".

    Tatayo.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2022
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    C'est bon !!!

    Après des jours de galère, j'ai réussi.

    Un grand merci tatayo pour m'avoir guidé, effectivement un problème de jointure. J'ai pu avoir mes NULL que j'ai remplacé par des 0 pour comparer deux années entre elles et faire des ratios !

    Mille mercis encore !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/03/2009, 23h52
  2. Réponses: 18
    Dernier message: 09/12/2008, 11h40
  3. Réponses: 5
    Dernier message: 28/04/2008, 15h48
  4. remplacer les valeurs nulles dans une table
    Par jessy212 dans le forum Access
    Réponses: 4
    Dernier message: 28/08/2006, 14h22
  5. Comment gérer les valeur Nulles dans une requête ?
    Par sondo dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/03/2005, 12h02

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