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 :

Requête imbriquée : Coup de main requête sql


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 242
    Points : 71
    Points
    71
    Par défaut Requête imbriquée : Coup de main requête sql
    Bonjour à tous,

    j'ai une table;

    fac_id, num_fac, dt_fac
    1111 23456 01/01/2015
    1112 56678 02/01/2015



    Je veux récupérer le fac_id du chaque mois dont le num_fac est le plus grand.

    Merci d'avance de votre aide, n'hésitez pas à revenir vers moi si je ne suis pas clair.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Quel est votre SGBD ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 242
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Bonjour,

    Quel est votre SGBD ?
    le SGBD est oracle 11g

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Essayez comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select fac_id
    from ma_table main
    where month(dt_fac) = $var_mois  
      and not exists
         (select 1 from ma_table subq
          where month(subq.dt_fac) = $var_mois
            and subq.num_fac > main.num_fac)
    J'ai mis une variable pour le mois, pour pouvoir exécuter ce traitement en début de mois, afin d'extraire les données du mois précédent

    Bien sur, il faut que DT_FAC soit une colonne de type date !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 242
    Points : 71
    Points
    71
    Par défaut
    Bonjour,

    Merci pour votre réponse, quand je lance la requete ci-dessus, j'ai une seule ligne,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select fac_id
    from facture fac1
    where dt_fac BETWEEN '01/01/2013' AND '29/06/2013' 
      and not exists
         (select 1 from facture fac2
          where fac2.dt_fac BETWEEN '01/01/2013' AND '29/06/2013'
            and fac2.num_fac > fac1.num_fac)
    le résultat, j'ai qu'une seule ligne, moi je souhaite avoir une fac_id pour chaque mois pendant la période d'analyse.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    OK, je n'avais pas compris cela, en ce cas, procédez comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH CTE AS                                     
        (SELECT ROW_NUMBER()                        
                OVER(PARTITION BY MONTH(DT_FAC)     
                     ORDER BY NUM_FAC DESC) AS RANG 
               ,DT_FAC
               ,FAC_ID                              
               ,NUM_FAC                             
         FROM MA_TABLE)                             
    SELECT * FROM CTE WHERE RANG=1

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 242
    Points : 71
    Points
    71
    Par défaut Plus d'infos
    Bonjour,

    Je te remercie pour ta réponse, je vais réexpliquer le besoin,

    j'ai la table suivante :


    num_id Fac_id fac_dt mnt
    123 111 01/01/2015 50
    124 122 20/01/2015 30
    125 133 25/01/2015 170
    126 144 20/22/2015 80
    127 155 24/02/2015 60

    je veux afficher que les lignes des dates 25/01/2015 et 24/02/2015, qui correspondent aux dates maximum de chaque mois.

    Merci.


    Citation Envoyé par escartefigue Voir le message
    OK, je n'avais pas compris cela, en ce cas, procédez comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH CTE AS                                     
        (SELECT ROW_NUMBER()                        
                OVER(PARTITION BY MONTH(DT_FAC)     
                     ORDER BY NUM_FAC DESC) AS RANG 
               ,DT_FAC
               ,FAC_ID                              
               ,NUM_FAC                             
         FROM MA_TABLE)                             
    SELECT * FROM CTE WHERE RANG=1

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    OK, mais ce n'était pas l'expression de besoin du premier post
    Si ce n'est plus le plus grand n° de facture du mois, mais la plus grande valeur de date de facture pour le mois, alors il suffit de modifier ma requête précédente comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH CTE AS                                     
        (SELECT ROW_NUMBER()                        
                OVER(PARTITION BY MONTH(DT_FAC)     
                     ORDER BY DT_FAC DESC) AS RANG 
               ,DT_FAC
               ,FAC_ID                              
               ,NUM_FAC                             
         FROM MA_TABLE)                             
    SELECT * FROM CTE WHERE RANG=1
    Si toutefois on ne voulait qu'une et une seule facture par mois, il faut procéder autrement (ici on a toutes les factures correspondant à la date max de chaque mois)
    D'où l'intérêt d'être précis dans l'expression de besoins

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 242
    Points : 71
    Points
    71
    Par défaut Mettre en place,
    Bonjour,

    Je ne sais pas comment mettre en place cette requête, pourrais-tu m'expliquer stp...

    Merci.

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Et de me coté je ne suis pas sur d'avoir compris la question , c'est une partie de la requete que vous ne comprenez pas ?

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 242
    Points : 71
    Points
    71
    Par défaut
    Oui stp, c'est cette partie que je n'ai pas compris

    WITH CTE AS

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    CTE est une Common Table Expression, c'est à dire une table temporaire, qui permet de créer un résultat et de s'appuyer ensuite sur ce résultat pour des requêtes.
    C'est souvent plus pratique car plus facile à lire que des imbrications successives de requetes.

    Attention, MySQL ne connait pas les CTE

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 242
    Points : 71
    Points
    71
    Par défaut
    Ca marche à MERVEILLE, MILLE MERCI.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 242
    Points : 71
    Points
    71
    Par défaut
    Encore une fois, merci bien,

    Est ce que tu peux me dire comment implémenter la requête que tu m'as expliqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH CTE AS                                     
        (SELECT ROW_NUMBER()                        
                OVER(PARTITION BY MONTH(DT_FAC)     
                     ORDER BY DT_FAC DESC) AS RANG 
               ,DT_FAC
               ,FAC_ID                              
               ,NUM_FAC                             
         FROM MA_TABLE)                             
    SELECT * FROM CTE WHERE RANG=1
    dans une requête global, il y a d'autres tables qui sont liés à la table "MA_TABLE",

  15. #15
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Pour répondre il faut la description des tables supplémentaires, de leurs index, et un laïus expliquant le résultat à obtenir
    Avec un exemple c'est encore mieux

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 242
    Points : 71
    Points
    71
    Par défaut
    Date facture Num facture Ref Client Mnt TOTAL TVA

    01 - 2013 21482165 AB87368 2041999 1254631 12387,83
    02 - 2013 22265045 CD715473 707129 1422602 17256,63
    03 - 2013 23007229 YS622683 657366 1280049 15428,82

    Table Facture Table CLIENT Table Suivi facturation


    La table Facture est lié aux 2 tables par le champ FAC_ID

  17. #17
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par coolmek Voir le message
    Date facture Num facture Ref Client Mnt TOTAL TVA

    01 - 2013 21482165 AB87368 2041999 1254631 12387,83
    02 - 2013 22265045 CD715473 707129 1422602 17256,63
    03 - 2013 23007229 YS622683 657366 1280049 15428,82

    Table Facture Table CLIENT Table Suivi facturation


    La table Facture est lié aux 2 tables par le champ FAC_ID
    le n° de facture dans la table des clients ? ça m'étonnerait beaucoup
    Je suppose qu'il y a donc le numéro de client dans la table des factures, ce qui donnerait ceci :
    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
    WITH CTE AS                                     
        (SELECT ROW_NUMBER()                        
                OVER(PARTITION BY MONTH(DT_FAC)     
                     ORDER BY DT_FAC DESC) AS RANG 
               ,DT_FAC
               ,NUM_FAC                             
               ,REF_CLI
               ,MNT
               ,TVA
         FROM FACTURE)                             
    SELECT month(DT_FAC)
          ,year(DT_FAC)
          ,NUM_FAC
          ,REF_CLI
          ,MNT
          ,TVA
    FROM CTE 
    WHERE RANG=1

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

Discussions similaires

  1. Un petit coup de main en SQL, SVP
    Par mazeille dans le forum Langage SQL
    Réponses: 12
    Dernier message: 11/10/2013, 14h22
  2. Réponses: 2
    Dernier message: 17/01/2012, 10h09
  3. [MySQL] Erreur SQL 1064 : Requête imbriquée avec jointure !
    Par patchankito dans le forum Langage SQL
    Réponses: 5
    Dernier message: 31/01/2006, 10h37
  4. besoin d'un coup de main pour une requête ;)
    Par Fabouney dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/11/2005, 23h14
  5. [PL/SQL]requête imbriquée
    Par Nadine dans le forum Oracle
    Réponses: 6
    Dernier message: 01/02/2005, 16h21

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