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

Développement SQL Server Discussion :

Afficher tout les types même si aucune relation n'existe


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de djidane39
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 272
    Par défaut Afficher tout les types même si aucune relation n'existe
    Bonjour

    Voilà mon problème :
    J'ai 2 tables :

    - Type
    code | libelle
    0 | Appart
    1 | Studio
    2 | Villa
    ...

    - Immeuble
    id | type | Surface
    0 | 0 | 52
    1 | 0 | 65
    2 | 1 | 12
    ...

    Je voudrais obtenir la somme des surfaces pour chaque type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    	Type.libelle,
    	SUM(Immeuble.surface)
    FROM Type
    JOIN Immeuble
    	ON Type.id = Immeuble.type
    WHERE Immeuble.id > 0 AND Immeuble.id < 100
    GROUP BY Type.libelle
    Or si je fait ça, et que certains types ne sont attribués à aucun immeuble, il va me manquer des lignes de types en résultat. Il me faudrait une valeur pour chaque type, quitte à ce que ça soit 0 si il n'y y aucun immeuble pour un type donné.
    Comment faire?

  2. #2
    Membre expérimenté
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Par défaut
    Bonjour,

    Oui cela est possible, il faut travailler avec les jointures externes soit les opéréteurs RIGHT OUTER JON, LEFT OUTER JOIN ou FULL OUTER JOIN (suivant le type d'ouverture souhaité) à la place de JOIN. La condition de joiture reste la même

  3. #3
    Membre expérimenté Avatar de djidane39
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 272
    Par défaut
    J'ai modifié ma requête comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    	Type.libelle,
    	SUM(ISNULL(Immeuble.surface, 0))
    FROM Type
    LEFT OUTER JOIN Immeuble
    	ON Type.id = Immeuble.type
    WHERE Immeuble.id > 0 AND Immeuble.id < 100
    GROUP BY Type.libelle
    Malheureusement, j'ai toujours le même résultat : je n'ai pas une ligne pour chaque type...

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    C'est le sens de ISNULL qui n'est pas bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    	Type.libelle,
    	ISNULL(SUM(Immeuble.surface), 0)
    FROM Type
    LEFT OUTER JOIN Immeuble
    	ON Type.id = Immeuble.type
    WHERE Immeuble.id > 0 AND Immeuble.id < 100
    GROUP BY Type.libelle
    Si la somme est NULL, alors on la met à 0, pas si la surface est NULL

    @++

  5. #5
    Membre expérimenté Avatar de djidane39
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 272
    Par défaut
    Merci!
    Mais j'ai toujours le même problème -_-'

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bizarre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    DECLARE @TbType TABLE
    (
    	code TINYINT,
    	libelle VARCHAR(10)
    )
     
    DECLARE @TbImmeuble TABLE
    (
    	ID TINYINT,
    	type TINYINT,
    	Surface TINYINT
    )
     
    INSERT INTO @TbType VALUES (0, 'Appart')
    INSERT INTO @TbType VALUES (1, 'Studio')
    INSERT INTO @TbType VALUES (2, 'Villa')
     
    INSERT INTO @TbImmeuble VALUES (0, 0, 52)
    INSERT INTO @TbImmeuble VALUES (1, 0, 65)
    INSERT INTO @TbImmeuble VALUES (2, 1, 52)
     
    SELECT TYPE.Code, 
    		ISNULL(SUM(IMMEUBLE.Surface), 0) AS SurfaceTotale
    FROM @TbType TYPE
    LEFT JOIN @TbImmeuble IMMEUBLE ON TYPE.code = IMMEUBLE.type
    GROUP BY TYPE.Code
    Me retourne :

    Code SurfaceTotale
    -------------------------------
    0 117
    1 52
    2 0
    @++

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

Discussions similaires

  1. [VxiR2] Afficher toutes les dates même sans données
    Par blackdespe dans le forum Designer
    Réponses: 2
    Dernier message: 02/09/2014, 06h44
  2. Réponses: 2
    Dernier message: 17/08/2012, 09h21
  3. Réponses: 8
    Dernier message: 05/07/2012, 14h35
  4. afficher toutes les images en meme temps
    Par dietrich dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/04/2006, 12h18
  5. Réponses: 1
    Dernier message: 29/11/2005, 00h37

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