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 30/08/2011, 16h22   #1
Futur Membre du Club
 
Inscription : juin 2006
Messages : 115
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 115
Points : 18
Points : 18
Par défaut Requête créant des valeurs ?

Bonjour,

J'ai une table qui contient un grand nombre de valeurs, cependant, si les valeurs étaient à 0 lors de l'input, rien a été ajouté à la table. Je dois donc trouver un moyen pour faire en sorte de remplir ces "trous" avec des 0.

Exemple:
Code :
1
2
3
4
5
6
Service     Domaine     Personnes
1           1           1
2           1           3
3           1           5
1           2           2
3           2           4
Dans mon petit exemple, on peut voir que le service 2 du domaine 2 n'existe pas car il n'y avait 0 personne. Je dois donc créer une requête me permettant d'avoir ce résultat:
Code :
1
2
3
4
5
6
7
Service     Domaine     Personnes
1           1           1
2           1           3
3           1           5
1           2           2
2           2           0
3           2           4
Si quelqu'un pouvait m'aider, ce serait grandement apprécié.

Merci !
Norin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 16h49   #2
Membre émérite
 
Inscription : août 2008
Messages : 835
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 835
Points : 823
Points : 823
Bonjour,

Vous pouvez faire un produit cartésien entre les services et les domaines, puis faire une jointure externe du résultat à votre table actuelle pour récupérer la valeur de "personnes". Vous pourrez ensuite remplacer les NULL par des 0.

Comment déterminez vous l'ensemble des valeurs de service et de domaine?
En admettant que ce soit en en sélectionnant les valeurs distinctes de votre table (table1 dans la requête) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
WITH domaine
AS
(
	SELECT DISTINCT domaine 
	FROM table1
),
service AS
(
 	SELECT DISTINCT service 
	FROM table1
)
SELECT s.service, d.domaine, coalesce(t.personnes,0) AS personnes
FROM domaine d
CROSS JOIN service s
LEFT JOIN table1 t 
	 ON t.service = s.service 
	 AND t.domaine = d.domaine
ORDER BY domaine, service, personnes
Si les colonnes service et domaine de votre table sont des clés étrangères, vous pouvez peut être utiliser les tables référencées pour faire votre produit cartésien.
Snipah est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/08/2011, 17h46   #3
Futur Membre du Club
 
Inscription : juin 2006
Messages : 115
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 115
Points : 18
Points : 18
Bonjour,

Tout d'abord, un grand merci pour votre aide.

En ce qui concerne la répartition de mes données, la voici:
T_PIL_Services = Contient tous les services avec un ID, Code et Nom
T_PIL_Domaines = Contient tous les domaines avec un ID, Zone et Nom
T_MODEL_Personnes = Contient toutes les personnes rattachées à un service et un domaine.

Je travail actuellement sous Access 2007, j'ai donc remplacé le coalesce par la fonction Nz et le cross join par un simple FROM T_PIL_Domaines d, T_PIL_Services s

Cependant, le WITH ne semble pas fonctionner sous Access, j'ai donc tenté de simplement ajouter les valeurs dans mon select, mais je reçois une erreur de syntaxe dans l'opération JOIN
Norin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 10h42   #4
Membre émérite
 
Inscription : août 2008
Messages : 835
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 835
Points : 823
Points : 823
D'où l'utilité de préciser son SGBD, Access est assez spécial.
Une remarque en passant, vos colonnes ID ne devraient pas avoir le même nom d'une table à une autre, c'est plus simple de s'y retrouver dans l'écriture des requêtes. Par exemple id_domaine et id_service.

Si vous n'avez toujours pas votre solution, essayez peut être comme ceci :
Code :
1
2
3
4
5
6
SELECT sd.id_service, sd.id_domaine, coalesce(t.personnes,0) AS personnes
FROM (SELECT d.ID AS id_domaine, s.ID AS id_service FROM T_PIL_Domaines d, T_PIL_Services s) sd
LEFT JOIN table1 t 
     ON t.id_service = sd.id_service 
     AND t.id_domaine = sd.id_domaine
ORDER BY id_domaine, id_service, personnes
Snipah est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/08/2011, 17h06   #5
Futur Membre du Club
 
Inscription : juin 2006
Messages : 115
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 115
Points : 18
Points : 18
Ça semble fonctionner !

Un très très grand merci !
Norin 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 15h04.


 
 
 
 
Partenaires

Hébergement Web