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

SQL Oracle Discussion :

Aide pour construction requête avec MAX


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut Aide pour construction requête avec MAX
    Bonjour a tous

    J'ai besoin d'un petit coup de pouce pour une requete car je tourne en rond

    J'ai une table surface, dedans il y a 3 type de surface possible par bien-immobilier (surface plancher, surface interne et surface externe).

    Je travail sur le bien immobilier 138.

    Vue que l'on veux garder l'historique des surface par bien immobilier, quand une surface change, on crée une nouvelle ligne et on donne la date de modification de la surface avec la nouvel superficie.

    Mon but est d'arrivé a mettre sur la meme ligne pour un bien ommobilier la derniere surface plancher, la dernier surface interieur et la derniere surface exterieur

    J’ai déjà fait une requête qui me ramène les dernières surface de chaque type de surface
    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 s.SURF_CDN, s.BIM_CDN, s_plan.SURF_NOMBRE_NB as surface_plancher, s_int.SURF_NOMBRE_NB  as surface_int, s_ext.SURF_NOMBRE_NB as surface_ext
    from PAT65.SURFACE s,
     
        (select s.SURF_CDN, s.BIM_CDN, s.SURF_NOMBRE_NB, s.SURF_DATE_MODIF_DT
        from PAT65.SURFACE s
        where s.SURF_DATE_MODIF_DT =
          (select max(s1.SURF_DATE_MODIF_DT)
          from PAT65.SURFACE s1 
          where s1.TYSUR_CDA = 'PLAN!' 
          and s1.BIM_CDN=138
          group by s1.BIM_CDN)
        and s.TYSUR_CDA= 'PLAN!') s_plan,
     
        (select s.SURF_CDN, s.BIM_CDN, s.SURF_NOMBRE_NB, s.SURF_DATE_MODIF_DT
        from PAT65.SURFACE s
        where s.SURF_DATE_MODIF_DT =
          (select max(s1.SURF_DATE_MODIF_DT)
          from PAT65.SURFACE s1 
          where s1.TYSUR_CDA = 'INT!' 
          and s1.BIM_CDN=138
          group by s1.BIM_CDN)
        and s.TYSUR_CDA= 'INT!') s_int,
     
        (select s.SURF_CDN, s.BIM_CDN, s.SURF_NOMBRE_NB, s.SURF_DATE_MODIF_DT
        from PAT65.SURFACE s
        where s.SURF_DATE_MODIF_DT =
          (select max(s1.SURF_DATE_MODIF_DT)
          from PAT65.SURFACE s1 
          where s1.TYSUR_CDA = 'EXT!' 
          and s1.BIM_CDN=138
          group by s1.BIM_CDN)
        and s.TYSUR_CDA= 'EXT!') s_ext
     
    where s.SURF_CDN=s_plan.SURF_CDN(+)
    and s.SURF_CDN=s_int.SURF_CDN(+)
    and s.SURF_CDN=s_ext.SURF_CDN(+)
    and s.BIM_CDN=138
    Mon probleme c'est que je n'arrive pas a faire metre les surface sur la meme ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SURF_CDN   BIM_CDN     SURFACE_PLANCHER        SURFACE_INT         SURFACE_EXT
    626           138                 231                (null)                  (null)
    628           138                 (null)              (null)                  (null)
    627           138                 (null)              (null)                  (null)
    629           138                 (null)              7777                  (null)
    630           138                 (null)              (null)                  6666
    126           138                 (null)              (null)                  (null)
    DSL pour la misse en forme catastrophique de mon résultat ^^'

    Donc voila comment modifier ma requête pour virer les ligne en trop et avoir les 3 surface sur la même ligne

    Merci de votre aide

  2. #2
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    je viens de virer la colonne surf_cdn qui était ma clef primaire de cette table car vue que je veux mettre 3 surface sur une même ligne il ne sert a rien de vouloir garder une clef primaire ^^'

    ma requete est donc devenu
    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
     
     
    select s.BIM_CDN, s_plan.SURF_NOMBRE_NB as surface_plancher, s_int.SURF_NOMBRE_NB  as surface_int, s_ext.SURF_NOMBRE_NB as surface_surface_ext
    from PAT65.SURFACE s,
     
        (select s.BIM_CDN, s.SURF_NOMBRE_NB, s.SURF_DATE_MODIF_DT
        from PAT65.SURFACE s
        where s.SURF_DATE_MODIF_DT =
          (select max(s1.SURF_DATE_MODIF_DT)
          from PAT65.SURFACE s1 
          where s1.TYSUR_CDA = 'PLAN!' 
          and s1.BIM_CDN=138
          group by s1.BIM_CDN)
        and s.TYSUR_CDA= 'PLAN!') s_plan,
     
        (select s.BIM_CDN, s.SURF_NOMBRE_NB, s.SURF_DATE_MODIF_DT
        from PAT65.SURFACE s
        where s.SURF_DATE_MODIF_DT =
          (select max(s1.SURF_DATE_MODIF_DT)
          from PAT65.SURFACE s1 
          where s1.TYSUR_CDA = 'INT!' 
          and s1.BIM_CDN=138
          group by s1.BIM_CDN)
        and s.TYSUR_CDA= 'INT!') s_int,
     
        (select s.BIM_CDN, s.SURF_NOMBRE_NB, s.SURF_DATE_MODIF_DT
        from PAT65.SURFACE s
        where s.SURF_DATE_MODIF_DT =
          (select max(s1.SURF_DATE_MODIF_DT)
          from PAT65.SURFACE s1 
          where s1.TYSUR_CDA = 'EXT!' 
          and s1.BIM_CDN=138
          group by s1.BIM_CDN)
        and s.TYSUR_CDA= 'EXT!') s_ext
     
    where s.BIM_CDN=s_plan.BIM_CDN
    and s.BIM_CDN=s_int.BIM_CDN
    and s.BIM_CDN=s_ext.BIM_CDN
    and s.BIM_CDN=138
    group by s.BIM_CDN, s_plan.SURF_NOMBRE_NB, s_int.SURF_NOMBRE_NB, s_ext.SURF_NOMBRE_NB
    Ma requête ramène une seul ligne avec les 3 types de surface

    Cette requête a quand même l'air tordue ... il y a pas un moyen plus simple pour arriver au même résultat??

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Essayez ainsi :
    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
    WITH SR AS
    (
      SELECT BIM_CDN
           , TYSUR_CDA
           , max(SURF_NOMBRE_NB) keep(dense_rank first order by SURF_DATE_MODIF_DT desc) as SURFACE
        FROM PAT65.SURFACE
       WHERE TYSUR_CDA IN ('EXT!', 'INT!', 'PLAN!')
         AND BIM_CDN = 138
    GROUP BY BIM_CDN, TYSUR_CDA
    )
      SELECT BIM_CDN
           , max(case TYSUR_CDA when 'PLAN!' then surface end) as SURFACE_PLANCHER
           , max(case TYSUR_CDA when 'INT!'  then surface end) as SURFACE_INT
           , max(case TYSUR_CDA when 'EXT!'  then surface end) as SURFACE_EXT
        FROM SR
    GROUP BY BIM_CDN;

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    Merci waldar pour ton aide
    mais ta requête me ramène la max(date_modif) au lieu de la surface de la dernière date de modif





    Edit :
    Merci pour cette nouvelle version (je l'ai corriger tu avais laisser trainer un "s1" devant un nom de colonne

    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
     
    WITH SR AS
    (
      SELECT BIM_CDN
           , TYSUR_CDA
           , max(SURF_NOMBRE_NB) keep(dense_rank first ORDER BY SURF_DATE_MODIF_DT DESC) AS SURFACE
        FROM PAT65.SURFACE
       WHERE TYSUR_CDA IN ('EXT!', 'INT!', 'PLAN!')
       --  AND BIM_CDN = 138
    GROUP BY BIM_CDN, TYSUR_CDA
    )
      SELECT BIM_CDN
           , max(case TYSUR_CDA when 'PLAN!' then surface end) AS SURFACE_PLANCHER
           , max(case TYSUR_CDA when 'INT!'  then surface end) AS SURFACE_INT
           , max(case TYSUR_CDA when 'EXT!'  then surface end) AS SURFACE_EXT
        FROM SR
    GROUP BY BIM_CDN;
    en plus ta version marche pour tout les bien immobilier d'un site

    Merci

  5. #5
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    oups finalement ma requête n'est pas bonne non plus car cette version ne marche que pour un bien immobilier connue

    je dois arrivé a faire tourner ma requête sur un site qui a plusieur bien immobliler

    le lien pour savoir si a quel site appartient un bien immobilier se trouve dans la table BIEN_IMMOBILIER, j'ai la PK du site

    je cherche comment adapter ma requête

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Nota : j'ai édité la précédente réponse qui était erronée.

    Une autre solution :
    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
    WITH SR AS
    (
      SELECT BIM_CDN
           , TYSUR_CDA
           , SURF_NOMBRE_NB
           , row_number() over(partition by BIM_CDN, TYSUR_CDA order by SURF_DATE_MODIF_DT desc) as rn
        FROM PAT65.SURFACE
       WHERE TYSUR_CDA IN ('EXT!', 'INT!', 'PLAN!')
         AND BIM_CDN = 138
    )
      SELECT BIM_CDN
           , max(case TYSUR_CDA when 'PLAN!' then SURF_NOMBRE_NB end) as SURFACE_PLANCHER
           , max(case TYSUR_CDA when 'INT!'  then SURF_NOMBRE_NB end) as SURFACE_INT
           , max(case TYSUR_CDA when 'EXT!'  then SURF_NOMBRE_NB end) as SURFACE_EXT
        FROM SR
       WHERE rn = 1
    GROUP BY BIM_CDN;

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Par contre ce serait bien de fournir un jeu de données, soit sous forme de WITH, soit avec un create table et quelques insert.
    Ne mettez que les colonnes intéressantes et des lignes utiles (pas besoin de 300 lignes qui font la même chose).

    C'est plus simple pour tester des solutions.

Discussions similaires

  1. Demande d'aide pour une requête avec jointure
    Par marcoxavier dans le forum Développement
    Réponses: 8
    Dernier message: 26/05/2015, 16h04
  2. Besoin d'aide sur une requête avec un MAX()
    Par lcristin dans le forum Langage SQL
    Réponses: 5
    Dernier message: 05/03/2013, 14h57
  3. Réponses: 4
    Dernier message: 02/09/2008, 21h57
  4. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

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