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

Langage SQL Discussion :

Afficher les lignes vides dans une requete


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 47
    Points : 30
    Points
    30
    Par défaut Afficher les lignes vides dans une requete
    Salut, j'ai une requete un peu compliquée :

    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
    SELECT P1,P2,X-Y1+Z,X-Y2+Z,X-Y3+Z,X-Y4+Z,X-Y5+Z,X-Y6+Z,X-Y7+Z from 
     
    (SELECT max(com) AS P1, code_com AS P2 ,sum(conso_chauf_EF_init*cout) as X FROM Sc_Volontariste INNER JOIN coutenergie  on Sc_Volontariste.cmbl_init = coutenergie.cmbl
     WHERE CATL = 'Résidence Principale'  
    group by code_com order by P2 asc) A,
     
    (SELECT max(com) AS Q1, code_com AS Q2,sum(conso_Murs_EF*cout) as Y1,sum(conso_Toit_EF*cout) as Y2,sum(conso_Plan_EF*cout) as Y3,sum(conso_Fen_EF*cout) as Y4,sum(conso_Vent_EF*cout) as Y5,sum(conso_Syst_EF*cout) as Y6,sum(conso_chauf_EF*cout) as Y7 FROM Sc_Volontariste INNER JOIN coutenergie  on Sc_Volontariste.cmbl = coutenergie.cmbl
     WHERE CATL = 'Résidence Principale'  
    group by code_com order by Q2 asc) B,
     
    (SELECT max(com) AS R1, code_com AS R2,sum(prod_elec_syst_ef* (select cout from coutenergie where CMBL ='Coût de revente électricité')) as Z FROM Sc_Volontariste
     WHERE CATL = 'Résidence Principale'  
    group by code_com order by R2 asc) C 
     
    where P2=R2 AND P2=Q2
    Elle affiche un tableau avec comme colonne :

    Commune; code_INSEE; Calcul1 ;...; Calcul7

    je voudrais que dans le résultat, il y ait les lignes qui ont une commune et un code_EPCI mais tout le reste a vide. C'est a dire, que n'importe quelle recherche ou on ajoute des truc au where rend quand même toutes les communes même celles ou tout les calcules sont à 0.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 790
    Points
    30 790
    Par défaut
    Il suffit de convertir vos jointures strictes en jointures externes...
    Vous auriez utilisé la syntaxe normalisée pour les jointure, cela se serait fait en modifiant un seul mot dans chaque jointure
    Tout ceci est fort bien expliqué dans ce tutoriel : Les jointures, ou comment interroger plusieurs tables
    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.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    J'ai déjà regardé ce tuto et je n'ai pas réussi à faire ce que je veux. Je pense qu'il faut que j'utilise LEFT OUTER JOIN mais je ne sais pas comment faire sur ma requête.

    J'ai testé cela :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    SELECT A1,BA1,X-Y1+Z,X-Y2+Z,X-Y3+Z,X-Y4+Z,X-Y5+Z,X-Y6+Z,X-Y7+Z from
     
    (Select max(com) AS A1,max(code_com) AS A2 FROM Sc_Volontariste WHERE code_DEP = 22 group by code_com order by A2 asc) A
     
    LEFT OUTER JOIN
     
    (SELECT * from 
     
    (SELECT max(code_com) AS BA1 ,sum(conso_chauf_EF_init*cout) as X FROM Sc_Volontariste INNER JOIN coutenergie  on Sc_Volontariste.cmbl_init = coutenergie.cmbl
     WHERE CATL = 'Résidence Principale' 
     AND TYPL = 'Appartement' 
     AND HLML = 'Non-HLM' 
     AND STOC = 'Logé gratuitement' 
     AND TYPO = 'Pavillons post 68 (2000-05)' 
     AND code_DEP = 22  
    group by code_com order by BA1 asc) BA,
     
    (SELECT max(code_com) AS BB1,sum(conso_Murs_EF*cout) as Y1,sum(conso_Toit_EF*cout) as Y2,sum(conso_Plan_EF*cout) as Y3,sum(conso_Fen_EF*cout) as Y4,sum(conso_Vent_EF*cout) as Y5,sum(conso_Syst_EF*cout) as Y6,sum(conso_chauf_EF*cout) as Y7 FROM Sc_Volontariste INNER JOIN coutenergie  on Sc_Volontariste.cmbl = coutenergie.cmbl
     WHERE CATL = 'Résidence Principale' 
     AND TYPL = 'Appartement' 
     AND HLML = 'Non-HLM' 
     AND STOC = 'Logé gratuitement' 
     AND TYPO = 'Pavillons post 68 (2000-05)' 
     AND code_DEP = 22  
    group by code_com order by BB1 asc) BB,
     
    (SELECT max(code_com) AS BC1,sum(prod_elec_syst_ef* (select cout from coutenergie where CMBL ='Coût de revente électricité')) as Z FROM Sc_Volontariste
     WHERE CATL = 'Résidence Principale' 
     AND TYPL = 'Appartement' 
     AND HLML = 'Non-HLM' 
     AND STOC = 'Logé gratuitement' 
     AND TYPO = 'Pavillons post 68 (2000-05)' 
     AND code_DEP = 22  
    group by code_com order by BC1 asc) AC 
     
    where BA1=BB1 AND BA1=BC1) B
     
    on A2 = BA1
    mais cette requête me rend un résultat vide car la requête B est vide.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Tu devrais utiliser des alias pour toutes tes tables et préfixer les colonnes avec ces alias. Cela permettrait de savoir d'où viennent les colonnes.

    Je récris ta requête avec une indentation plus claire :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    SELECT A1, BA1, 
        X - Y1 + Z, 
        X - Y2 + Z, 
        X - Y3 + Z, 
        X - Y4 + Z, 
        X - Y5 + Z, 
        X - Y6 + Z, 
        X - Y7 + Z 
    FROM (
        SELECT max(com) AS A1,
            max(code_com) AS A2 
        FROM Sc_Volontariste 
        WHERE code_DEP = 22 
        GROUP BY code_com ORDER BY A2 ASC
    ) A
    LEFT OUTER JOIN (
        SELECT * 
        FROM (
            SELECT max(code_com) AS BA1, 
                sum(conso_chauf_EF_init*cout) AS X 
            FROM Sc_Volontariste 
            INNER JOIN coutenergie ON Sc_Volontariste.cmbl_init = coutenergie.cmbl
            WHERE CATL = 'Résidence Principale' 
                AND TYPL = 'Appartement' 
                AND HLML = 'Non-HLM' 
                AND STOC = 'Logé gratuitement' 
                AND TYPO = 'Pavillons post 68 (2000-05)' 
                AND code_DEP = 22  
            GROUP BY code_com 
            ORDER BY BA1 ASC
        ) BA
        INNER JOIN (
            SELECT max(code_com) AS BB1,
                sum(conso_Murs_EF*cout) AS Y1,
                sum(conso_Toit_EF*cout) AS Y2,
                sum(conso_Plan_EF*cout) AS Y3,
                sum(conso_Fen_EF*cout) AS Y4,
                sum(conso_Vent_EF*cout) AS Y5,
                sum(conso_Syst_EF*cout) AS Y6,
                sum(conso_chauf_EF*cout) AS Y7 
            FROM Sc_Volontariste 
            INNER JOIN coutenergie ON Sc_Volontariste.cmbl = coutenergie.cmbl
            WHERE CATL = 'Résidence Principale' 
                AND TYPL = 'Appartement' 
                AND HLML = 'Non-HLM' 
                AND STOC = 'Logé gratuitement' 
                AND TYPO = 'Pavillons post 68 (2000-05)' 
                AND code_DEP = 22  
            GROUP BY code_com 
            ORDER BY BB1 ASC
        ) BB ON BA1 = BB1
        INNER JOIN (
            SELECT max(code_com) AS BC1,
                sum (prod_elec_syst_ef * (
                        SELECT cout 
                        FROM coutenergie 
                        WHERE CMBL = 'Coût de revente électricité'
                    )
                ) AS Z 
            FROM Sc_Volontariste
            WHERE CATL = 'Résidence Principale' 
                AND TYPL = 'Appartement' 
                AND HLML = 'Non-HLM' 
                AND STOC = 'Logé gratuitement' 
                AND TYPO = 'Pavillons post 68 (2000-05)' 
                AND code_DEP = 22  
            GROUP BY code_com 
            ORDER BY BC1 ASC
        ) AC ON BA1 = BC1
    ) B ON A2 = BA1
    On voit qu'il y a deux sous requêtes travaillant sur les mêmes ensembles de données :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    SELECT * 
        FROM (
            SELECT max(code_com) AS BA1, 
                sum(conso_chauf_EF_init*cout) AS X 
            FROM Sc_Volontariste 
            INNER JOIN coutenergie ON Sc_Volontariste.cmbl_init = coutenergie.cmbl
            WHERE CATL = 'Résidence Principale' 
                AND TYPL = 'Appartement' 
                AND HLML = 'Non-HLM' 
                AND STOC = 'Logé gratuitement' 
                AND TYPO = 'Pavillons post 68 (2000-05)' 
                AND code_DEP = 22  
            GROUP BY code_com 
            ORDER BY BA1 ASC
        ) BA
        INNER JOIN (
            SELECT max(code_com) AS BB1,
                sum(conso_Murs_EF*cout) AS Y1,
                sum(conso_Toit_EF*cout) AS Y2,
                sum(conso_Plan_EF*cout) AS Y3,
                sum(conso_Fen_EF*cout) AS Y4,
                sum(conso_Vent_EF*cout) AS Y5,
                sum(conso_Syst_EF*cout) AS Y6,
                sum(conso_chauf_EF*cout) AS Y7 
            FROM Sc_Volontariste 
            INNER JOIN coutenergie ON Sc_Volontariste.cmbl = coutenergie.cmbl
            WHERE CATL = 'Résidence Principale' 
                AND TYPL = 'Appartement' 
                AND HLML = 'Non-HLM' 
                AND STOC = 'Logé gratuitement' 
                AND TYPO = 'Pavillons post 68 (2000-05)' 
                AND code_DEP = 22  
            GROUP BY code_com 
            ORDER BY BB1 ASC
        ) BB ON BA1 = BB1
    On doit donc pouvoir n'en faire qu'une. D'autant plus qu'il y figure une curiosité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT max(code_com) AS BA1,
    -- ...
    GROUP BY code_com
    Avec le GROUP BY, le SGBD va prendre chaque valeur de code_com puis chercher le maximum de chaque valeur... c'est à dire la valeur elle-même !

    Cette partie devrait donc pouvoir être simplifiée comme suit :
    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
    SELECT v.code_com, 
        sum(conso_chauf_EF_init * cout) AS X
        sum(conso_Murs_EF * cout) AS Y1,
        sum(conso_Toit_EF * cout) AS Y2,
        sum(conso_Plan_EF * cout) AS Y3,
        sum(conso_Fen_EF * cout) AS Y4,
        sum(conso_Vent_EF * cout) AS Y5,
        sum(conso_Syst_EF * cout) AS Y6,
        sum(conso_chauf_EF * cout) AS Y7
    FROM Sc_Volontariste AS v
    INNER JOIN coutenergie AS c ON v.cmbl_init = c.cmbl
    WHERE v.CATL = 'Résidence Principale' 
        AND v.TYPL = 'Appartement' 
        AND v.HLML = 'Non-HLM' 
        AND v.STOC = 'Logé gratuitement' 
        AND v.TYPO = 'Pavillons post 68 (2000-05)' 
        AND v.code_DEP = 22
    GROUP BY v.code_com
    La requête complète devrait donner ça :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    SELECT A.A1, B.code_com, 
        B.X - B.Y1 + B.Z AS Calcul_1, 
        B.X - B.Y2 + B.Z AS Calcul_2, 
        B.X - B.Y3 + B.Z AS Calcul_3, 
        B.X - B.Y4 + B.Z AS Calcul_4, 
        B.X - B.Y5 + B.Z AS Calcul_5, 
        B.X - B.Y6 + B.Z AS Calcul_6, 
        B.X - B.Y7 + B.Z AS Calcul_7 
    FROM (
        SELECT max(com) AS A1,
            max(code_com) AS A2 
        FROM Sc_Volontariste 
        WHERE code_DEP = 22
    ) A
    LEFT OUTER JOIN (
        SELECT *
        FROM (
            SELECT v.code_com, 
                sum(conso_chauf_EF_init * cout) AS X
                sum(conso_Murs_EF * cout) AS Y1,
                sum(conso_Toit_EF * cout) AS Y2,
                sum(conso_Plan_EF * cout) AS Y3,
                sum(conso_Fen_EF * cout) AS Y4,
                sum(conso_Vent_EF * cout) AS Y5,
                sum(conso_Syst_EF * cout) AS Y6,
                sum(conso_chauf_EF * cout) AS Y7
            FROM Sc_Volontariste v
            INNER JOIN coutenergie c ON v.cmbl_init = c.cmbl
            WHERE v.CATL = 'Résidence Principale' 
                AND v.TYPL = 'Appartement' 
                AND v.HLML = 'Non-HLM' 
                AND v.STOC = 'Logé gratuitement' 
                AND v.TYPO = 'Pavillons post 68 (2000-05)' 
                AND v.code_DEP = 22
            GROUP BY v.code_com
        ) vc
            INNER JOIN (
                SELECT code_com,
                    sum (prod_elec_syst_ef * (
                            SELECT cout 
                            FROM coutenergie 
                            WHERE CMBL = 'Coût de revente électricité'
                        )
                    ) AS Z 
                FROM Sc_Volontariste
                WHERE CATL = 'Résidence Principale' 
                    AND TYPL = 'Appartement' 
                    AND HLML = 'Non-HLM' 
                    AND STOC = 'Logé gratuitement' 
                    AND TYPO = 'Pavillons post 68 (2000-05)' 
                    AND code_DEP = 22  
                GROUP BY code_com
            ) ac ON ac.code_com = vc.code_com
    ) B ON B.code_com = A.code_com
    ORDER BY A.code_com
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    J'ai fait autrement en lançant les deux requêtes séparément et en faisant un test dans java.

    La dernière solution que tu donnes ne marche pas.
    Il me dit qu'il y a un problème avec le sum de la ligne 20.

    Après c'est peut être parce que j'utilise une base de données embarquée qui n'est pas 100% compatible avec les instructions SQL (Derby embedded).

    Merci quand même de ton aide.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/11/2011, 14h18
  2. [AC-2007] Afficher colonne vide dans une requete analyse croisée
    Par julius26 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/07/2011, 11h59
  3. Afficher la ligne entière dans une listView Sans les headers
    Par Msysteme dans le forum Windows Forms
    Réponses: 2
    Dernier message: 26/02/2009, 12h56
  4. Afficher les mois vides dans une requête
    Par Nessie37 dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 04/12/2007, 14h35
  5. Réponses: 0
    Dernier message: 24/08/2007, 12h27

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