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 :

Tri sur deux tables


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Points : 125
    Points
    125
    Par défaut Tri sur deux tables
    Bonjour à tous,

    Je cherche à faire un tri à partir de deux dates provenant de deux tables.
    Une table Dossier et une table Facture.
    En fait c'est simple je pense mais je me suis perdu.
    La table Dossier dispose d'une date de création dont je cherche à récupérer celles qui sont entre l'année en cours -2 et l'année en cours +2.
    Facile jusque là.
    Après je veux compter le nombre de factures pour chacun des dossiers renvoyés, donc je fais ma jointure avec la table Facture et je fais un count sur la rubrique le numéro de Dossier dans la table Facture.
    La table facture dispose d'une date de facturation, donc un dossier peut avoir plusieurs factures.

    Mon souci c'est que je ne veux pas des factures attachées aux dossiers n'étant pas compris entre l'année en cours -2 à l'année en cours +2

    Voici la requête actuelle;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT d_agence, d_dossier, d_tiers, count(f_dossier), d_dtcre
    	 FROM dossier left outer join facture
    	 ON (f_soc=d_soc and f_agence=d_agence and f_dossier=d_dossier )
    	 where YEAR (d_dtcre) between (YEAR(NOW())-2) and YEAR(NOW()+2)
    	 group by 2
    Le problème c'est que celle-ci me retourne des factures datant de 2008, donc le count n'est pas bon.
    J'avais essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND d_dossier IN (Select f_dossier from Facture where YEAR (f_dtfac) between (YEAR(NOW())-2) and YEAR(NOW()+2))
    Le problème c'est que si il n'y à pas de facture entre les deux dates, la requête ne me retourne même pas le dossier avec le count à 0, elle ne me retourne rien.

    Si vous avez des questions/éclaircissement, je suis là.
    Merci d'avance pour vos idées.

    Jefty

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2013
    Messages : 7
    Points : 10
    Points
    10
    Par défaut
    Bonjour Jefty,

    Peut-être de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT d_agence, d_dossier, d_tiers, count(f_dossier), d_dtcre
    FROM dossier LEFT OUTER JOIN facture
    ON (f_soc=d_soc AND f_agence=d_agence AND f_dossier=d_dossier )
    WHERE YEAR(d_dtcre) BETWEEN (YEAR(NOW())-2) AND YEAR(NOW()+2)
      and (YEAR(f_dtfac) BETWEEN (YEAR(NOW())-2) AND YEAR(NOW()+2) or f_dtfac is null)
    GROUP BY d_agence, d_dossier, d_tiers, d_dtcre

  3. #3
    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,
    Citation Envoyé par Jefty Voir le message
    Mon souci c'est que je ne veux pas des factures attachées aux dossiers n'étant pas compris entre l'année en cours -2 à l'année en cours +2
    Là on parle de la date des dossier (c'est ce que je comprends de la phrase) ou des factures (d'après la deuxième requête) ?
    Si c'est le premier cas le test est déjà dans la première requête, si c'est le deuxième il faut ajouter le critère dans la jointure:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT d_agence, d_dossier, d_tiers, count(f_dossier), d_dtcre
    	 FROM dossier LEFT OUTER JOIN facture
    	 ON (f_soc=d_soc AND f_agence=d_agence AND f_dossier=d_dossier and YEAR (f_dtfac) BETWEEN (YEAR(NOW())-2) AND YEAR(NOW()+2) )
    	 WHERE YEAR (d_dtcre) BETWEEN (YEAR(NOW())-2) AND YEAR(NOW()+2)
    	 GROUP BY d_agence, d_dossier, d_tiers,d_dtcre

    Tatayo.

    P.S. je me suis permis de corriger le GROUP BY...

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Je constate que toutes les colonnes du SELECT qui ne font pas l'objet d'une fonction de regroupement ne se retrouvent pas dans la clause GROUP BY
    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  d_agence
        ,   d_dossier
        ,   d_tiers
        ,   COUNT(f_dossier)
        ,   d_dtcre
    FROM    dossier 
        LEFT OUTER JOIN 
            facture
            ON  f_soc = d_soc 
            AND f_agence = d_agence
            AND f_dossier = d_dossier 
    WHERE   YEAR (d_dtcre) BETWEEN YEAR(NOW()) - 2 AND YEAR(NOW()) + 2
    GROUP BY d_agence                                               
        ,   d_dossier
        ,   d_tiers
        ,   d_dtcre
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre habitué Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Points : 125
    Points
    125
    Par défaut
    Merci à vous trois pour les remarques et l'aide.
    Deuxième solution fonctionnel.

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

Discussions similaires

  1. Sélection et tri sur deux tables
    Par comode dans le forum Langage SQL
    Réponses: 6
    Dernier message: 19/10/2012, 19h23
  2. [1.x] Stratégie de tri sur deux tables
    Par Fused dans le forum Symfony
    Réponses: 4
    Dernier message: 10/02/2011, 09h32
  3. Requete sur deux tables avec tri
    Par ebaoo dans le forum MySQL
    Réponses: 2
    Dernier message: 25/02/2010, 18h41
  4. Tri sur deux tables
    Par GriffinK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/01/2010, 13h51
  5. 2 Count() sur deux tables en jointures gauches
    Par Alexandre T dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2003, 16h53

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