Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/09/2011, 16h56   #1
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 0
Points : 0
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 :
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.
ldv75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 17h03   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 092
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 092
Points : 1 898
Points : 1 898
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 :
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.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 17h04   #3
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
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.

Citation:
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é
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 17h14   #4
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 0
Points : 0
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
ldv75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 17h18   #5
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 092
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 092
Points : 1 898
Points : 1 898
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.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 17h26   #6
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 0
Points : 0
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
ldv75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 17h48   #7
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 092
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 092
Points : 1 898
Points : 1 898
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...
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 17h54   #8
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 0
Points : 0
Par défaut ENCORE MERCI

Bonne continuation
ldv75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h02.


 
 
 
 
Partenaires

Hébergement Web