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 :

Je suis dans une impasse


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Je suis dans une impasse
    Bonjour, je viens vers vous car il semble que mes connaissances en sql atteignent leur limite.

    Je vous explique : J'ai une table qui s'appele RELEVE dans laquelle vient se déverser le solde bancaire du jour de près de 200 sociétés.

    Le but de ma requête est d'obtenir le dernier solde disponible pour chaque société.

    La requête se présente actuellement comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT *
    FROM RELEVES
    WHERE ANNEE = year(!P_DATE)
    AND MOIS = month(!P_DATE)
    AND JOUR = (
        select MAX(JOUR) 
        FROM RELEVES 
        where ANNEE = year(!P_DATE) 
        AND MOIS = month(!P_DATE) 
        AND JOUR <= day(!P_DATE)
    )

    P_DATE est un paramètre que je renseigne manuellement.

    Problème : la requête va chercher le dernier relevé disponible sauf qu'elle ne le fait pas pour toute les sociétés, la recherche s'arrête à la première date disponible. EX : si une société à un relevé au 12/09, la requête cherchera tous les relevés du 12/09, hors certaines sociétés ont leur dernier relevé au 11/09, je souhaiterais donc que la requête aille chercher le dernier relevé disponible pour CHAQUE société.


    Merci par avance de votre aide parce que la je bloque complètement.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Le resultat est normal, vu que tu cherches la dernière date toutes sociétés confondues.
    Tu peux utiliser une jointure externe:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select r1.*
    from releve as r1
    left outer join releve as r2 on r1.societe = r2.societe and r2.annee = r1.annee and r2.mois = r1.mois and r2.jour > r1.jour
    where r2.societe is null and r1.ANNEE = year(!P_DATE)
    AND r1.MOIS = month(!P_DATE)

    Petite question: pourquoi utiliser 3 colonnes pour la date, au lieu d'une colonne de type date ?

    Tatayo.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    c'est normal, la sous-requête ne fait aucune référence à une société (mais de toute façon le "WHERE = (" générerait alors une erreur.

    Le but de ma requête est d'obtenir le dernier solde disponible pour chaque société.
    Ce serait bien d'indiquer la structure de la table ainsi que le SGBD utilisé
    Merci d'ajouter un sur les tags qui vous ont aidé

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut waw waw waw
    hé oh doucement les gars (j'ai oublié de préciser que je n’était pas un professionnel du langage sql).

    En lisant vos messages mon cerveau à buggé

    r1 et r2 connais pas
    sgbd connais pas

    En fait je suis salarié d'une société qui à achet" un logiciel de base de données (open executive) la seule formation que j'ai eue c'est la construction de requêtes simples

    Merci encore

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Citation Envoyé par ldv75 Voir le message
    r1 et r2 connait pas
    r1 et r2 sont des alias sur la table RELEVES (tiens, j'ai oublié un s dans la requête ). C'est nécessaire car je fais une jointure entre RELEVES et RELEVES...

    Tatayo.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut MERCI
    Je viens d'essayer ça l'air de fonctionner, je ne voudrais pas te déranger mais si tu peux me faire une mini explication sur la requête que tu viens de me donner ça serait super, je dormirais moins con ce soir

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    LJe but est de renvoyer toutes les lignes de RELEVES pour lesquelles il n'existe pas de ligne avec la même société, la même année, le même mois et un jour.

    Je suis passé par une jointure externe, je prends toutes les lignes de RELEVES (R1), et si elles existent les lignes ayant la même société, les mêmes années et mois, et un jour supérieur, mais je ne garde que les lignes de R1 pour lesquelles je n'ai rien trouvé dans R2.

    Donc:
    le LEFT OUTER JOIN pour renvoyer toutes les lignes de R1, qu'il y ait correspondance ou pas dans R2,
    et le r2.societe is null pour ne garder que les lignes de résultat où R2 n'a pas été trouvé.

    Tatayo.

    P.S. il y a quelques cours de SQL sur ce site, tu devrais y jeter un œil...

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut ENCORE MERCI
    Bonne continuation

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/02/2007, 16h17
  2. [TP]lire une ligne de l'ecran et la stocker dans une chaine
    Par Bleuarff dans le forum Turbo Pascal
    Réponses: 26
    Dernier message: 02/07/2002, 10h08
  3. gérer les jpg dans une fenetre directdraw???
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2002, 13h39
  4. Réponses: 3
    Dernier message: 09/05/2002, 01h39
  5. faire un selection dans une image aves les APIs
    Par merahyazid dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/04/2002, 10h44

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