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 :

Requete trois tables trop complexe pour moi


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Requete trois tables trop complexe pour moi
    Bonjour,
    Je ne sais pas comment trouver de l'aide sur le type de requête que je veux réaliser, alors j'ouvre une nouvelle discussion.
    J'ai 3 tables :

    Tcpte avec numéros de comptes bancaires
    Banque Compte
    BNP 3001
    CIC 4230


    TExtrait avec la liste des extraits bancaires, sur tous les comptes.
    Le numéro de l'extrait ne dépend pas du compte bancaire, mais s'incrémente à chaque fois.
    Compte NoExtrait Date RefExtrait
    3001 10 18/08/15 A2345
    4230 11 18/08/15 346
    3001 12 19/08/15 A4544


    TLignExtrait avec le détail des lignes de chaque extrait bancaire
    NoExtrait Montant
    10 121,00
    10 63,00
    11 80,00
    11 23,00
    12 125,00
    12 75,00


    Et je cherche à retrouver, en une seule requête le montant total du dernier extrait de chaque banque.
    En gros, je cherche le résultat suivant :
    Banque Compte NoDernExtr Date RefExtrait
    MontTotal
    BNP 3001 12 19/08/15 A4544 200,00(=125+75)
    CIC 4230 11 18/08/15 346 103(=80+23)

    La requête est un peu trop complexe pour le grand débutant que je suis.
    J'arrive à avoir le dernier extrait par un JOIN et Max (Date),
    J'arrive à avoir le total de chaque extrait
    Mais pas les 2 à la fois !

    Merci de votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Une solution est de considérer que le dernier est celui pour lequel il n'en existe pas avec le même code banque et une date supérieure (ou un numéro supérieur...).
    C'est faisable par exemple avec une jointure externe, un not exists...
    Tu peux aussi utiliser une sous-requête qui renvoie l'Id du dernier extrait, puis l'utiliser comme table dans ta requête qui fait les totaux.

    Tatayo.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Quel est votre SGBD ?

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Waldar : SQL Server

    Tatayo: voici le début de ma requete

    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
    SELECT Tcpte.Banque, 
    Tcpte.Compte, 
    TExtrait.NoExtrait
    SUM(TLignExtrait)
     
    FROM Tcpte, 
    Textrait JOIN (SELECT Max(TExtrait.Date) as maxdate , TExtrait.Compte as NoCpte FROM TExtrait GROUP BY TExtrait.Compte)  AS TMax 
    ON Textrait.Compte=TMax.NoCpte AND Textrait.Date=TMax.maxdate,
    TLignExtrait
     
    WHERE TCpte.Compte = TExtrait.Compte
     
    GROUP BY
        TCpte.Banque, 
        Tcpte.Compte, 
        TExtrait.NoExtrait
    De cette maniere, je recupère bien la liste uniquement des derniers extrait,
    Mais mon total de chaque extrait n'est pas bon : il me met le montant total de toutes lignes de tous les extrait pour tout.
    Banque
    Compte
    NoExtrat
    Date
    MontantTotal
    BNP 3001 12 19/08/15 487,00
    CIC 4230 11 18/08/15 487,00


    COmment faire pour que ma somme soit uniquement sur les derniers extraits
    Merci

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Si tu réécris ta requête en normalisant les jointures (avec INNER JOIN), tu vas vite trouver ce qui ne va pas.

    Accessoirement la requête sera plus lisible...

    Tatayo.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Que veux dire normaliser les jointures ?
    J'ai essayé en remplacant JOIN par INNER JOIN, cela donne le même résultat.
    Il y a un point qui m'échappe encore

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il y a plusieurs erreurs dans votre requête, il faut d'abord faire les traitements unitaires avant de faire les calculs.

    Je vous mets la requête ci-dessous, je vous laisse l'analyser :
    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
    with cte_TExtrait (Compte, NoExtrait, Date, RefExtrait, rn) as  -- Affectation d'un classement trié par date descendante puis par NoExtrait
    (
    select Compte, NoExtrait, Date, RefExtrait
         , row_number() over(partition by Compte order by Date desc, NoExtrait desc)
      from Textrait
    )
      ,  cte_TExtrait_last (Compte, NoExtrait, Date, RefExtrait) as -- Récupération des données Extrait uniquement pour le premier classement
    (
    select Compte, NoExtrait, Date, RefExtrait
      from cte_TExtrait
     where rn = 1
    )
      ,  cte_TLignExtrait_agg (NoExtrait, Montant) as               -- Calcul du montant total pour les extraits concernés
    (
      select lge.NoExtrait
           , sum(lge.Montant)
        from TLignExtrait      as lge
        join cte_TExtrait_last as ctl on ctl.NoExtrait = lge.NoExtrait
    group by lge.NoExtrait
    )
    select cpt.Banque                                               -- Derniere étape de présentation des données
         , cpt.Compte
         , ctl.NoExtrait  as NoDernExtr
         , ctl.Date
         , ctl.RefExtrait
         , clg.Montant    as MontTotal
      from Tcpte                as cpt
      join cte_TExtrait_last    as ctl on ctl.Banque    = cpt.Banque
      join cte_TLignExtrait_agg as clg on clg.NoExtrait = ctl.NoExtrait;

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci Waldar !
    C'est exactement ce qu'il me fallait pour coomprendre l'enchainement et avance
    Ca fonctionne comme je veux

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

Discussions similaires

  1. Besoin d'aide sur un select trop complexe pour moi
    Par Oribiahn dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/08/2010, 15h22
  2. UPDATE/SELECT un peu trop complexe pour moi
    Par Yateri dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/08/2010, 15h17
  3. Requête trop complexe pour moi
    Par snips67 dans le forum Requêtes
    Réponses: 6
    Dernier message: 27/01/2010, 09h24
  4. Tri complexe trop complexe pour moi
    Par nemo67 dans le forum Développement
    Réponses: 4
    Dernier message: 18/12/2009, 14h03
  5. Une requête trop complexe pour moi
    Par prgasp77 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 14/01/2009, 17h12

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