Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/09/2011, 15h22   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 48
Points : 14
Points : 14
Par défaut Valeur NULL dans une jointure

Bonjour,

J'ai un problème, je m'explique, je fais une jointure dans une table en utilisant des alias.
Je cherche à calculer des sommes de ventes par trimestre.
Or quand il n'y a pas de vente pour un trimestre, ma jointure ne marche pas, c'est pourquoi j'ai utilisé un "LEFT OUTER JOIN", du coup ça m'indique bien ma ligne de mon produit mais au lieu d'avoir somme des prix à "0", j'ai un champ vide.
Comment puis je faire pour forcer une valeur s'il y a un NULL ?
perdeak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 15h25   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 543
Points : 7 543
La fonction COALESCE() résoudra ton problème.
__________________
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 15h43   #3
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
NVL() - Oracle
ISNULL() - SQL Server
IFNULL() - Access
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 15h44   #4
Candidat au titre de Membre du Club
 
Inscription : décembre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 48
Points : 14
Points : 14
Citation:
Envoyé par al1_24 Voir le message
La fonction COALESCE() résoudra ton problème.
En fait j'ai déjà essayé cette fonction,
Code :
COALESCE (SUM(montant), 0)
mais le résultat est le même, ça me renvoie champ vide...d'ailleurs j'ai un produit pour lequel il n'y a aucun montant sur aucun des trimestre, il me sort bien 0 sur chaque trimestre, la ligne qui ne marche pas, j'ai un montant au 1er trimestre et puis plus de montant sur les 3 autres, et c'est là que le champ vide apparait....
perdeak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 15h47   #5
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 543
Points : 7 543
Sans connaître ta requête, il devient difficile de t'aider.
__________________
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 11h07   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
COALESCE (SUM(montant), 0)
Ce serait plutôt:
Code :
SUM(COALESCE(montant,0))
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 12h13   #7
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
si les nulls te pose de problème, tu peux les exclure à l'aide de

Code :
WHERE champ IS NOT NULL
en gardant

Code :
COALESCE (SUM(montant), 0)
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 12h23   #8
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Code :
WHERE champ IS NOT NULL
Attention une table ne contient pas des champs et des enregistrements mais des colonnes et des lignes
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2011, 21h22   #9
Candidat au titre de Membre du Club
 
Inscription : décembre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 48
Points : 14
Points : 14
Merci pour vos réponse mais je n'obtiens pas de résultat...

Le COALESCE est censé faire quoi exactement ?
perdeak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2011, 23h20   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
COALESCE retroune le premier de ces arguments non nul :
Code :
1
2
COALESCE (NULL, 1) -- retourne 1
COALESCE (a / 0, NULL, 2) -- retourne 2
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 20h31   #11
Candidat au titre de Membre du Club
 
Inscription : décembre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 48
Points : 14
Points : 14
Alors voilà ma requête :
Code :
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
(SELECT 
    t.code_famille AS "Code Famille",
    t.texte_famille AS "Texte Famille",
    COUNT(t.*) AS Nombre,
    SUM(t.montant) AS Montant,
    round(sum(t.montant)/(SELECT sum(montant)/100 FROM test),2) AS "%/Total",
    (t1.montant_trim_1) AS "Montant 1er trimestre",
    (t2.montant_trim_2) AS "Montant 2eme trimestre",
    (t3.montant_trim_3) AS "Montant 3eme trimestre",
    (t4.montant_trim_4) AS "Montant 4eme trimestre"
FROM test t
LEFT OUTER JOIN
(
    SELECT code_famille, 
        SUM(montant) AS montant_trim_1
    FROM test 
    WHERE (EXTRACT(MONTH FROM date) BETWEEN 1 AND 3)
    GROUP BY code_famille
) AS t1 ON t1.code_famille = t.code_famille
LEFT OUTER JOIN
(
    SELECT code_famille, 
        SUM(montant) AS montant_trim_2
    FROM test 
    WHERE (EXTRACT(MONTH FROM date) BETWEEN 4 AND 6)
    GROUP BY code_famille
) AS t2 ON t2.code_famille = t.code_famille
...
GROUP BY t.code_famille, t.texte_famille, t1.montant_trim_1, t2.montant_trim_2, t3.montant_trim_3, t4.montant_trim_4
ORDER BY SUM(t.montant) DESC)
Donc du coup, sur une référence, j'ai une valeur au trimestre 1 et puis pas de valeurs pour les 3 trimestres suivants. Le problème il me met champ vide au lieu de 0 dans mon résultat, même en utilisant COALESCE.
perdeak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 23h15   #12
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Je ne vois pas de COALESCE dans ta requête !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 06h56   #13
Candidat au titre de Membre du Club
 
Inscription : décembre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 48
Points : 14
Points : 14
Citation:
Envoyé par CinePhil Voir le message
Je ne vois pas de COALESCE dans ta requête !
J'ai essayé de le mettre comme indiqué au dessus dans le post, de plusieurs façons, rien n'y fait...

Ça donne ça :
Code :
1
2
3
4
5
6
7
8
LEFT OUTER JOIN
(
    SELECT code_famille, 
        COALESCE(SUM(montant),0) AS montant_trim_1 -- ou SUM(COALESCE(montant,0))
    FROM test 
    WHERE (EXTRACT(MONTH FROM date) BETWEEN 1 AND 3)
    GROUP BY code_famille
) AS t1 ON t1.code_famille = t.code_famille
perdeak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 08h35   #14
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 092
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 092
Points : 1 898
Points : 1 898
Bonjour,
Je pense qu'il faut ajouter les coalesce dans cette partie de la requête:
Code SQL :
1
2
3
4
5
6
7
 
...
(t1.montant_trim_1) AS "Montant 1er trimestre",
    (t2.montant_trim_2) AS "Montant 2eme trimestre",
    (t3.montant_trim_3) AS "Montant 3eme trimestre",
    (t4.montant_trim_4) AS "Montant 4eme trimestre"
...
Au cas où l'un des montant soit null (i.e. pas de valeur renvoyée).

Tatayo.
tatayo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 18h29   #15
Candidat au titre de Membre du Club
 
Inscription : décembre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 48
Points : 14
Points : 14
Citation:
Envoyé par tatayo Voir le message
Bonjour,
Je pense qu'il faut ajouter les coalesce dans cette partie de la requête:
Code SQL :
1
2
3
4
5
6
7
 
...
(t1.montant_trim_1) AS "Montant 1er trimestre",
    (t2.montant_trim_2) AS "Montant 2eme trimestre",
    (t3.montant_trim_3) AS "Montant 3eme trimestre",
    (t4.montant_trim_4) AS "Montant 4eme trimestre"
...
Au cas où l'un des montant soit null (i.e. pas de valeur renvoyée).

Tatayo.
Merci ça marche nickel
perdeak est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h00.


 
 
 
 
Partenaires

Hébergement Web