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 :

[Débutant] Jointure ou sous-requête ?


Sujet :

Langage SQL

  1. #1
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut [Débutant] Jointure ou sous-requête ?
    Bonjour,

    J'avance dans la construction de ma requête (voir discussion précédente).

    J'arrive à compter le nombre de logements, en faire la somme, additionner les surfaces et en faire la somme.

    Ce que je désire encore améliorer :
    - chaque logement a un coût
    - le coût se trouve dans une table liée à ma table `LOGEMENT`, `COUT_LOGEMENT`
    - pour chaque logement, il y a 1 à n enregistrements, avec une date `DEBUT_PERIODE` distincte.

    Je voudrais donc récupérer le coût du logement dans l'enregistrement lié dont la date de début est la plus haute.

    Je suis parti dans l'idée de faire une jointure.

    Ce que je n'arrive pas à faire, c'est récupérer l'enregistrement désiré à coup sûr.

    Car évidemment :

    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
    SELECT imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , imm.DATE_DEBUT
        , dist.NOM_DISTRICT
        , comm.NOM_COMMUNE
        , statut.TYPE
        , travaux.TYPE
        , COUNT(CASE log.NOMBRE_PIECE WHEN 1 THEN log.NOMBRE_PIECE END) AS 1p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 1 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COALESCE(SUM(CASE log.NOMBRE_PIECE WHEN 1 THEN coutlog.COUT END), 0) AS Cout
        , COUNT(CASE log.NOMBRE_PIECE WHEN 2 THEN log.NOMBRE_PIECE END) AS 2p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 2 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE log.NOMBRE_PIECE WHEN 3 THEN log.NOMBRE_PIECE END) AS 3p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 3 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE log.NOMBRE_PIECE WHEN 4 THEN log.NOMBRE_PIECE END) AS 4p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 4 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE log.NOMBRE_PIECE WHEN 5 THEN log.NOMBRE_PIECE END) AS 5p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 5 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE WHEN log.NOMBRE_PIECE BETWEEN 1 AND 5 THEN log.NOMBRE_PIECE END) AS Nb_log
        , COALESCE(ROUND(SUM(CASE WHEN log.NOMBRE_PIECE BETWEEN 1 AND 5 THEN log.SURFACE_NETTE END), 2), 0) AS Surface
    FROM IMMEUBLE AS imm
    JOIN DISTRICT AS dist
    JOIN COMMUNE AS comm
    JOIN TYPE_STATUT_IMMEUBLE AS statut
    JOIN TYPE_NATURE_TRAVAUX AS travaux
    JOIN LOGEMENT AS log
    INNER JOIN COUT_LOGEMENT AS coutlog
    ON dist.ID = comm.DISTRICT_ID_FK
        AND comm.ID = imm.COMMUNE_ID_FK
        AND statut.ID = TYPE_STATUT_IMMEUBLE_ID_FK
        AND travaux.ID = TYPE_NATURE_TRAVAUX_ID_FK
        AND log.IMMEUBLE_ID_FK = imm.ID
        AND coutlog.LOGEMENT_ID_FK = log.ID
    WHERE log.NOMBRE_PIECE BETWEEN 1 AND 5
    GROUP BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    ORDER BY imm.NUMERO_DOSSIER ASC
        , imm.LETTRE_DOSSIER asc
        , coutlog.DEBUT_PERIODE DESC LIMIT 1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    , coutlog.DEBUT_PERIODE DESC LIMIT 1;
    ne fonctionne pas.

    Je précise que pour le reste, dans la mesure où je précise une date de début période dans la clause WHERE, les résultats semblent cohérents.

    Puis-je obtenir le résultat désiré avec une simple jointure ou bien est-ce que je dois passer par une sous-requête ?

    Merci d'avance.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    La date la plus récente, c'est celle pour laquelle il n'en existe pas de plus récente !

    vous pouvez donc faire un test de non existence (NOT EXISTS) avec une sous requete dans la clause WHERE.

    Une autre solution est une jointure externe avec vérification de NULL pour la table jointe. Schématiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT ...
    FROM ...
    INNER JOIN COUT_LOGEMENT CL
        ON ...
    LEFT JOIN COUT_LOGEMENT CL2
        ON ...
        AND CL2.DEBUT_PERIODE > CL.DEBUT_PERIODE 
     
    WHERE ...
     
    AND CL2.DEBUT_PERIODE  IS NULL

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    As-tu tenté de ré-construire ta requête en ne conservant que la problématique du dernière en date ?


    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
    SELECT imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , imm.DATE_DEBUT
    	, log.NOMBRE_PIECE
    	, coutlog.DEBUT_PERIODE
    FROM IMMEUBLE AS imm
    JOIN LOGEMENT AS log
    INNER JOIN COUT_LOGEMENT AS coutlog
    ON dist.ID = comm.DISTRICT_ID_FK
        AND log.IMMEUBLE_ID_FK = imm.ID
        AND coutlog.LOGEMENT_ID_FK = log.ID
    WHERE log.NOMBRE_PIECE BETWEEN 1 AND 5
    GROUP BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    ORDER BY imm.NUMERO_DOSSIER ASC
        , imm.LETTRE_DOSSIER ASC
        , coutlog.DEBUT_PERIODE DESC LIMIT 1;
    C'est au niveau de l'ordre d'éxcusion du group by et du order by qu'il y a un problème.
    Le group by est réalisé avant l'application du order by et cela systématiquement.
    Or d'après ce que j'ai compris tes différentes lignes de coutlog sont fusionnées par le group by.

    Personnellement, je vois deux solutions :
    Faire un une jointure sur une sous-requête qui trie la table COUT_LOGEMENT.
    Réaliser le group by dans une requête englobant l'ensemble.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  4. #4
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Alors j'ai déjà essayé la première solution, mais je ne suis pas sûr d'avoir bien compris.

    Pas d'erreur, mais la requête tourne, tourne... sans résultat.

    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
    SELECT imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    	, imm.DATE_DEBUT
        , dist.NOM_DISTRICT
        , comm.NOM_COMMUNE
        , statut.TYPE
        , travaux.TYPE
        , COUNT(CASE log.NOMBRE_PIECE WHEN 1 THEN log.NOMBRE_PIECE END) AS 1p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 1 THEN log.SURFACE_NETTE END), 2), 0) AS m2
    	, COALESCE(SUM(CASE log.NOMBRE_PIECE WHEN 1 THEN coutlog2.COUT END), 0) AS Cout
        , COUNT(CASE log.NOMBRE_PIECE WHEN 2 THEN log.NOMBRE_PIECE END) AS 2p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 2 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE log.NOMBRE_PIECE WHEN 3 THEN log.NOMBRE_PIECE END) AS 3p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 3 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE log.NOMBRE_PIECE WHEN 4 THEN log.NOMBRE_PIECE END) AS 4p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 4 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE log.NOMBRE_PIECE WHEN 5 THEN log.NOMBRE_PIECE END) AS 5p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 5 THEN log.SURFACE_NETTE END), 2), 0) AS m2
    	, COUNT(CASE WHEN log.NOMBRE_PIECE BETWEEN 1 AND 5 THEN log.NOMBRE_PIECE END) AS Nb_log
    	, COALESCE(ROUND(SUM(CASE WHEN log.NOMBRE_PIECE BETWEEN 1 AND 5 THEN log.SURFACE_NETTE END), 2), 0) AS Surface
    FROM IMMEUBLE AS imm
    JOIN DISTRICT AS dist
    JOIN COMMUNE AS comm
    JOIN TYPE_STATUT_IMMEUBLE AS statut
    JOIN TYPE_NATURE_TRAVAUX AS travaux
    JOIN LOGEMENT AS log
    INNER JOIN COUT_LOGEMENT AS coutlog1
    LEFT JOIN COUT_LOGEMENT AS coutlog2
    ON dist.ID = comm.DISTRICT_ID_FK
    	AND comm.ID = imm.COMMUNE_ID_FK
    	AND statut.ID = TYPE_STATUT_IMMEUBLE_ID_FK
    	AND travaux.ID = TYPE_NATURE_TRAVAUX_ID_FK
    	AND log.IMMEUBLE_ID_FK = imm.ID
        AND coutlog1.LOGEMENT_ID_FK = log.ID
        AND coutlog2.LOGEMENT_ID_FK = log.ID
        AND coutlog2.DEBUT_PERIODE > coutlog1.DEBUT_PERIODE
    WHERE log.NOMBRE_PIECE BETWEEN 1 AND 5
    	AND coutlog2.DEBUT_PERIODE IS NULL
    GROUP BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    ORDER BY imm.NUMERO_DOSSIER ASC
        , imm.LETTRE_DOSSIER asc;
    Merci déjà pour ces premières réponses.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Domi2 Voir le message
    Pas d'erreur, mais la requête tourne, tourne... sans résultat.
    Pas étonnant, vous avez une série de produits cartésiens...

    Il n'y a qu'une seule condition de jointure dans votre requete initiale...

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    arfff,

    En fait si, mais vous aviez mis toutes les conditions dans la jointure de la dernière table.
    En ajoutant la jointure externe, cela vous faisant effectivement un produit cartésien sur toutes les autres tables...

    il convient de mettre les conditions de jointure à chaque jointure :

    quelque chose comme ceci (à vérifier)

    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
     
    SELECT imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    	, imm.DATE_DEBUT
        , dist.NOM_DISTRICT
        , comm.NOM_COMMUNE
        , statut.TYPE
        , travaux.TYPE
        , COUNT(CASE log.NOMBRE_PIECE WHEN 1 THEN log.NOMBRE_PIECE END) AS 1p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 1 THEN log.SURFACE_NETTE END), 2), 0) AS m2
    	, COALESCE(SUM(CASE log.NOMBRE_PIECE WHEN 1 THEN coutlog2.COUT END), 0) AS Cout
        , COUNT(CASE log.NOMBRE_PIECE WHEN 2 THEN log.NOMBRE_PIECE END) AS 2p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 2 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE log.NOMBRE_PIECE WHEN 3 THEN log.NOMBRE_PIECE END) AS 3p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 3 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE log.NOMBRE_PIECE WHEN 4 THEN log.NOMBRE_PIECE END) AS 4p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 4 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE log.NOMBRE_PIECE WHEN 5 THEN log.NOMBRE_PIECE END) AS 5p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 5 THEN log.SURFACE_NETTE END), 2), 0) AS m2
    	, COUNT(CASE WHEN log.NOMBRE_PIECE BETWEEN 1 AND 5 THEN log.NOMBRE_PIECE END) AS Nb_log
    	, COALESCE(ROUND(SUM(CASE WHEN log.NOMBRE_PIECE BETWEEN 1 AND 5 THEN log.SURFACE_NETTE END), 2), 0) AS Surface
    FROM IMMEUBLE AS imm
    JOIN COMMUNE AS comm
    	ON comm.ID = imm.COMMUNE_ID_FK
    JOIN DISTRICT AS dist
    	ON dist.ID = comm.DISTRICT_ID_FK
    JOIN TYPE_STATUT_IMMEUBLE AS statut
    	ON statut.ID = TYPE_STATUT_IMMEUBLE_ID_FK
    JOIN TYPE_NATURE_TRAVAUX AS travaux
    	ON travaux.ID = TYPE_NATURE_TRAVAUX_ID_FK
    JOIN LOGEMENT AS log
    	ON log.IMMEUBLE_ID_FK = imm.ID
    INNER JOIN COUT_LOGEMENT AS coutlog1
    	ON coutlog1.LOGEMENT_ID_FK = log.ID
    LEFT JOIN COUT_LOGEMENT AS coutlog2
        ON coutlog2.LOGEMENT_ID_FK = log.ID
        AND coutlog2.DEBUT_PERIODE > coutlog1.DEBUT_PERIODE
    WHERE log.NOMBRE_PIECE BETWEEN 1 AND 5
    	AND coutlog2.DEBUT_PERIODE IS NULL
    GROUP BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    ORDER BY imm.NUMERO_DOSSIER ASC
        , imm.LETTRE_DOSSIER ASC;

  7. #7
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Je réfléchis mieux l'estomac plein.

    J'ai donc commencé par essayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND coutlog2.DEBUT_PERIODE IS NOT NULL
    A priori, cela fonctionne, sauf que lorsque je n'ai qu'un enregistrement dans la table `COUT_LOGEMENT`, cela ne remonte pas dans le résultat.

    Je continue.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  8. #8
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Je suis en train de tester la dernière solution de aieeeuuuuu, cela semble fonctionner.

    Il faut maintenant que je vérifie quelques résultats.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  9. #9
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    C'est juste parfait

    J'ai juste dû changer mon alias pour les coûts.
    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
     
    SELECT imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , imm.DATE_DEBUT
        , dist.NOM_DISTRICT
        , comm.NOM_COMMUNE
        , statut.TYPE
        , travaux.TYPE
        , COUNT(CASE log.NOMBRE_PIECE WHEN 1 THEN log.NOMBRE_PIECE END) AS 1p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 1 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COALESCE(SUM(CASE log.NOMBRE_PIECE WHEN 1 THEN coutlog1.COUT END), 0) AS Cout
        , COUNT(CASE log.NOMBRE_PIECE WHEN 2 THEN log.NOMBRE_PIECE END) AS 2p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 2 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COALESCE(SUM(CASE log.NOMBRE_PIECE WHEN 2 THEN coutlog1.COUT END), 0) AS Cout
        , COUNT(CASE log.NOMBRE_PIECE WHEN 3 THEN log.NOMBRE_PIECE END) AS 3p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 3 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COALESCE(SUM(CASE log.NOMBRE_PIECE WHEN 3 THEN coutlog1.COUT END), 0) AS Cout
        , COUNT(CASE log.NOMBRE_PIECE WHEN 4 THEN log.NOMBRE_PIECE END) AS 4p
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 4 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COALESCE(SUM(CASE log.NOMBRE_PIECE WHEN 4 THEN coutlog1.COUT END), 0) AS Cout
        , COUNT(CASE log.NOMBRE_PIECE WHEN 5 THEN log.NOMBRE_PIECE END) AS 5p
        , COALESCE(SUM(CASE log.NOMBRE_PIECE WHEN 5 THEN coutlog1.COUT END), 0) AS Cout
        , COALESCE(ROUND(SUM(CASE log.NOMBRE_PIECE WHEN 5 THEN log.SURFACE_NETTE END), 2), 0) AS m2
        , COUNT(CASE WHEN log.NOMBRE_PIECE BETWEEN 1 AND 5 THEN log.NOMBRE_PIECE END) AS Nb_log
        , ROUND(SUM(CASE WHEN log.NOMBRE_PIECE BETWEEN 1 AND 5 THEN log.SURFACE_NETTE END), 2) AS Surface
        , SUM(CASE WHEN log.NOMBRE_PIECE BETWEEN 1 AND 5 THEN coutlog1.COUT END) AS Cout
    FROM IMMEUBLE AS imm
    JOIN COMMUNE AS comm
        ON comm.ID = imm.COMMUNE_ID_FK
    JOIN DISTRICT AS dist
        ON dist.ID = comm.DISTRICT_ID_FK
    JOIN TYPE_STATUT_IMMEUBLE AS statut
        ON statut.ID = TYPE_STATUT_IMMEUBLE_ID_FK
    JOIN TYPE_NATURE_TRAVAUX AS travaux
        ON travaux.ID = TYPE_NATURE_TRAVAUX_ID_FK
    JOIN LOGEMENT AS log
        ON log.IMMEUBLE_ID_FK = imm.ID
    INNER JOIN COUT_LOGEMENT AS coutlog1
        ON coutlog1.LOGEMENT_ID_FK = log.ID
    LEFT JOIN COUT_LOGEMENT AS coutlog2
        ON coutlog2.LOGEMENT_ID_FK = log.ID
        AND coutlog2.DEBUT_PERIODE > coutlog1.DEBUT_PERIODE
    WHERE log.NOMBRE_PIECE BETWEEN 1 AND 5
        AND coutlog2.DEBUT_PERIODE IS NULL
    GROUP BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
    ORDER BY imm.NUMERO_DOSSIER ASC
        , imm.LETTRE_DOSSIER ASC;
    Et les deux jointures pour isoler la dernière période, ça m'ouvre plein de perspectives.

    Merci beaucoup, c'est top.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    au fait, vous n'aviez pas précisé le SGBD il me semble, et le LIMIT m'avais fait supposer du MySQL

    Si ce n'est pas le cas, pour trouver le dernier cout du logement, il serait préférable de passer par des fonctions analytiques.

  11. #11
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Oui, c'est bien MySQL.

    Je sais que cela peut avoir une grande importance, il faut absolument que je m'en souvienne pour les prochaines discussions.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

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

Discussions similaires

  1. Jointure et sous-requête
    Par otmaneo01 dans le forum SQL
    Réponses: 0
    Dernier message: 06/06/2015, 18h55
  2. jointure et sous requête
    Par armellita dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/01/2015, 19h02
  3. Réponses: 2
    Dernier message: 15/05/2014, 18h04
  4. Jointure ou sous requête obligatoirement?
    Par ionesco dans le forum Requêtes
    Réponses: 7
    Dernier message: 17/09/2010, 13h47
  5. [Débutant] Requête SELECT avec max et sous-requête
    Par joefou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/07/2005, 14h28

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