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 :

left join et null [MariaDB]


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut left join et null
    Bonjour à tous,

    J'ai cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 
    	SUM(s.netpri * s.qty) AS netpri, s3.zpjt 
    FROM sinvoiced s 
    INNER JOIN sinvoicev s2 ON s2.num = s.num 
    LEFT JOIN sorderq s3 ON s.sohnum = s3.sohnum AND s.soplin = s3.soplin
    WHERE
    	s2.bpcinv = '00001' AND
    	s2.bpaadd = 'C01' AND
    	YEAR(s2.invdat) = '2020' AND MONTH(s2.invdat) BETWEEN 1 AND 12
    GROUP BY s3.zpjt;
    sorder --> commandes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sohnum |qty  |zpjt  |soplin|
    -------+-----+------+------+
    NORAA1 | 1.00|200201|  1000|
    NORAA1 |10.00|200201|  2000|
    NORAA2 | 2.00|200604|  3000|
    NORAA3 |10.00|      |  4000|
    NORAA3 |10.00|      |  5000|
    sinvoiced --> factures/avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    num    |sohnum|soplin|netpri|
    -------+------+------+------+
    FACBBB1|NORAA1|  1000|  7.07|
    FACBBB1|NORAA1|  2000|  8.63|
    FACBBB2|NORAA2|  3000|  2.04|
    FACBBB3|NORAA3|  4000|  8.02|
    FACBBB3|NORAA3|  5000|  8.02|
    AVCDDD1|      |      | 20.93|
    AVCDDD1|      |      | 21.02|
    Je ne détail pas sinvoicev car elle sert uniquement à filtrer les commandes par rapport à un numéro de client, une date et le INNER JOIN est ok.

    Le résultat donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    netpri |zpjt  |
    -------+------+
      41.95|[NULL]| --> correspond à AVCDDD1
     160.04|| --> correspond à FACBBB3
      87.70|200201| --> correspond à FACBBB1
       2.04|200604| --> correspond à FACBBB2

    Mon problème avec est le NULL, c'est un avoir qui devrait être déduit à des factures n'ayant pas de valeur zpjt. Le résultat devrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    netpri |zpjt  |
    -------+------+
     118.09|      | --> correspond à FACBBB3 - AVCDDD1
      87.70|200201| --> correspond à FACBBB1
       2.04|200604| --> correspond à FACBBB2
    Est-ce qu'il y a moyen de le faire en une requête ou bien est-ce que je vais devoir faire deux requêtes ?

    Merci d'avance.

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

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 450
    Par défaut
    Bonjour,
    Null n'est pas une valeur, donc il est normal que les deux lignes en question ne soient pas regroupées.
    Il faut ici remplacer Null par (visiblement) une chaine vide dans le SELECT et le GROUP BY avec un Coalesce/Isnull/IfNull/NullIf... en fonction de ce que propose MySQL.

    Tatayo.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Bonjour,

    Le problème fondamental est que, dans les données qui sont présentées dans l'exemple, aucune information ne permet d'associer les lignes FACBBB3 et AVCDDD1.
    Cette information est-elle disponible ailleurs dans la base de données ou dans d'autres colonnes des tables présentées ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Le seul lien commun a ces trois type d'enregistrement est le compte client (bpcinv) et le code adresse (bpaadd), mais dans un autre contexte ces critères vont être remplacé par une notion de famille client.

    FACBBB3 est la facture de la commande NORAA3, AVCDDD1 est un avoir n'ayant pas de lien avec une commande.

    @tatayo : je regarde ta proposition

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    @tatayou : j'ai ajouté COALESCE, il me remplace bien NULL par vide mais il n'en tien pas compte dans le GROUP BY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    netpri |zpjt  |
    -------+------+
      41.95|      | --> correspond à AVCDDD1
     160.04|      | --> correspond à FACBBB3
      87.70|200201| --> correspond à FACBBB1
       2.04|200604| --> correspond à FACBBB2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
    	SUM(s.netpri * s.qty) AS netpri,
    	COALESCE(s3.zpjt,'')
    FROM sinvoiced s 
    INNER JOIN sinvoicev s2 ON s2.num = s.num 
    LEFT JOIN sorderq s3 ON s.sohnum = s3.sohnum AND s.soplin = s3.soplin
    WHERE
    	s2.bpcinv = '00001' AND
    	s2.bpaadd = 'C01' AND
    	YEAR(s2.invdat) = '2020' AND MONTH(s2.invdat) BETWEEN 1 AND 12
    GROUP BY zpjt;

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 450
    Par défaut
    Comme je le disais, il faut aussi le mettre dans la clause GROUP BY.
    D'ailleurs je pense que n'importe quel autre SGBD aurait rejeté la requête.

    Tatayo.

  7. #7
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Mince alors je l'avais fait et mysql me sortait une erreur. Je viens de refaire le test et cela marche parfaitement.

    Merci.

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

Discussions similaires

  1. Left Join Is Null et condition de date
    Par elscorpio dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/10/2016, 16h00
  2. Réponses: 9
    Dernier message: 16/10/2009, 10h07
  3. LEFT JOIN - Valeur par défaut plutôt que NULL
    Par freegreg dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2007, 16h21
  4. Réponses: 6
    Dernier message: 23/01/2007, 10h17
  5. Left join, champ null et affichage dans etat
    Par catoucat dans le forum Access
    Réponses: 3
    Dernier message: 03/07/2006, 02h58

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