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 13/01/2011, 12h21   #1
Invité régulier
 
Inscription : février 2009
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 14
Points : 7
Points : 7
Par défaut aide jointure complète

Bonjour,

J'ai une requête sur laquelle je coince:

J'ai trois tables:

NbAccidentsLourds:
id, année, nbaccidents
1, 2009, 2
1, 2010, 3
2, 2008, 1

NbAccidentsLégers:
id, année, nbaccidents
1, 2009, 1
2, 2007, 1
3, 2006, 2

Tous:
id
1
2
3

Je voudrais obtenir pour chaque id, pour chaque année le nb d'accidents lourds et le nb d'accidents légers:
id, année, nbaccidentsLourd, nbaccidentsLégers
1, 2009, 2, 1
1, 2010, 3, null
2, 2007, 1, null
2, 2008, null, 1
3, 2006, null, 2

nb: null ou 0 marche aussi

Un première jointure gauche entre les ids et les accidents lourds me donne bien tous les accidents de tous les id pour chaque année.

Maintenant, je veux ajouter les accidents légers.
J'avais pensé à une jointure externe complète sur les champs id et année (car il me faut tous les enregistrements de chaque table).
Si il y a la même année dans les 2 tables cela marche bien. Mais si l'année est présente que dans accidents légers j'obtiens des lignes du genre:
id, année, nbaccidentsLourd, nbaccidentsLégers
null, null, null, 1
Logique puisque le couple id/année n'a pas été reconnu...

Et si le jointure ne porte que sur id, alors cela ne "regroupe" pas les années en 1 champ.

Auriez-vous des idées à ce problème?

Cordialement,
modenaft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 13h08   #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,

Ceci devrait faire l'affaire :
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
31
32
33
34
35
36
37
38
39
WITH 
NbAccidentsLourds
AS
( 
  SELECT 1 AS id, 2009 AS annee, 2 AS nbaccidents FROM dual
  union ALL
  SELECT 1 AS id, 2010 AS annee, 3 AS nbaccidents FROM dual
  union ALL
  SELECT 2 AS id, 2008 AS annee, 1 AS nbaccidents FROM dual
),
NbAccidentsLegers 
AS
(
  SELECT 1 AS id, 2009 AS annee, 1 AS nbaccidents FROM dual
  union ALL
  SELECT 2 AS id, 2007 AS annee, 1 AS nbaccidents FROM dual
  union ALL
  SELECT 3 AS id, 2006 AS annee, 2 AS nbaccidents FROM dual
),
tous
AS
(
  SELECT 1 AS id FROM dual
  union ALL
  SELECT 2 AS id FROM dual
  union ALL
  SELECT 3 AS id FROM dual
)
SELECT 
        ts.id, 
        coalesce(lourds.annee,legers.annee) AS annee, 
        lourds.nbaccidents AS nbaccidentslourds, 
        legers.nbaccidents AS nbaccidentslegers 
FROM tous ts
LEFT JOIN nbaccidentslourds lourds 
     FULL OUTER JOIN nbaccidentslegers legers 
          ON lourds.annee = legers.annee 
          AND lourds.id = legers.id
ON ts.id = coalesce(lourds.id, legers.id)
Snipah est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h44.


 
 
 
 
Partenaires

Hébergement Web