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

Développement SQL Server Discussion :

INNER JOIN sur la meme table


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Points : 0
    Points
    0
    Par défaut INNER JOIN sur la meme table
    bonjour à tous
    je voudrai avoir votre aide sur un petit problème que je rencontre sur une requette
    voila :
    ma table est la suivante
    Num-Client || Type-document || date || num-document || montant || num-doc-ext
    0001 || paiement || 01/03/2013 || 01 || 100 || ||
    001 || paiement || 01/04/2013 || 01 || 200 || ||
    001 || facture || 01/04/2013 || Fact01 || 350 || 01 ||
    001 || paiement || 01/02/2013 ||01 50 || ||
    002 || paiement || 01/02/2013 || 01 || 50 || ||

    je voudrai faire la somme des paiement du client qui a fait au moins un règlement au mois d'avril et faire la comparaison avec la facture pour savoir si elle est soldé, sachant que le" num-doc-ext" de la facture est le "num-document" du paiement

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Quelque chose comme ceci (pas testé):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT 
        F.num_client
        ,F.Montant AS facture
        ,SUM(P.montant) AS SommePaiement
    FROM LaTable F
    INNER JOIN LaTable P
      ON P.num_document = F.num_doc_ext
    WHERE F.Type_Document = 'facture'
    GROUP BY  
         F.num_client
        ,F.Montant AS facture
    HAVING MAX(CASE WHEN  P.date >= '2012-04-01T00:00:00'
      AND P.date < '2012-05-01T00:00:00' THEN 1 ELSE 0 END) = 1

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Points : 0
    Points
    0
    Par défaut merci
    merci normalement ça devrait marcher, je confirme dès que j'aurai les bons résultats

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Points : 0
    Points
    0
    Par défaut
    ça marche pas comme je veux

  5. #5
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    Je ne suis pas sûr de la cohérence du jeu de données fourni, je mets ici un script complet (création table, initialisation des données et requêtes) à modifier suivant le besoin

    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
    DECLARE @table TABLE (
    	  num_client		CHAR(4)
    	, Type_Document		VARCHAR(20)
    	, DateCreate		DATETIME
    	, Num_Document		VARCHAR(10)
    	, Montant			INT
    	, Num_Document_Ext	VARCHAR(10)
    )
     
    INSERT INTO @table (num_client, Type_Document, DateCreate, Num_Document, Montant, Num_Document_Ext)
    VALUES 
    ('0001', 'paiement', '20130301', '01', 100, null),
    ('001', 'paiement', '20130401', '01', 200, null),
    ('001', 'facture', '20130401', 'Fact01', 350, '01'),
    ('001', 'paiement', '20130102', '01', 50, null),
    ('002', 'paiement', '20130102', '01', 50, null)
     
    SELECT T1.num_client, T1.Num_Document, T1.Montant AS MontantFacture, SUM(T2.Montant) AS ReglementFactureAvril 
    FROM @table T1
    INNER JOIN @table T2 ON T1.Num_Document_Ext = T2.Num_Document
    WHERE T1.Type_Document = 'facture' -- Num_Document_Ext IS NOT NULL
    AND T2.DateCreate BETWEEN '20130401' AND '20130430'
    GROUP BY T1.num_client, T1.Num_Document, T1.Montant

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Points : 0
    Points
    0
    Par défaut merci pour ta réponse
    merci ça marche

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Points : 0
    Points
    0
    Par défaut ça se complique un peu
    les deux solution fonctionne tres bien mais :
    ya une condition suplémentaire et c la suivant :
    sommer les facture avec des numéro de facture différents , mais qui ont le meme numéro de document externe

    c a dire
    type doc = 'facture'
    [num ext] pour facture 1 = [num ext] facture 2 et = [num doc] paiement
    merci

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Points : 0
    Points
    0
    Par défaut c bon j'ai trouver
    Après votre précieuse aide j'ai enfin trouver le bon code pour ma requête :

    ------------------------------------------------------------
    SELECT
    F.[num client]
    ,f.[num ext]
    ,SUM(distinct F.Montant )AS facture
    ,SUM(distinct P.montant) AS SommePaiement
    FROM new F
    INNER JOIN new P
    ON P.[num doc] = F.[num ext]

    WHERE F.[type doc] = '2'

    GROUP BY
    F.[num client]
    ,F.[num ext]

    HAVING MAX(CASE WHEN P.[date doc] >= '20130301'
    AND P.[date doc] < '20130505' THEN 1 ELSE 0 END) = 1
    ------------------------------------------------------------------
    la nouveauté est que je cherche les paiement ayant été effectuer entre le 1er du mois précédent et la date du jour. je somme les paiement ayant le même numéro document et je compare par rapport aux facture ayant le [num ext] = [num doc], tout en sachant que je peux avoir deux facture avec le même [num ext].

    merci à tous pour votre aide

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Points : 0
    Points
    0
    Par défaut code qui me sort la premier du mois
    si ça peut aider quelqu'un

    (DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()) - 1, '19000101'))

Discussions similaires

  1. Deux inner join sur une même table
    Par Pachina75 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2014, 14h54
  2. Requete avec inner join sur une meme table
    Par mattmax dans le forum Développement
    Réponses: 1
    Dernier message: 15/12/2011, 14h34
  3. [MySQL] 2 left join sur le meme table
    Par adamess dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 08/07/2010, 20h56
  4. Double OUTER JOIN sur la meme table?
    Par nabab dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/01/2008, 18h48
  5. 3 Inner Join sur la même table
    Par Zolex dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/05/2007, 12h32

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