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 :

Demande de solution [2014]


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Décembre 2015
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Demande de solution
    Bonjour,

    je suis en train de créer une application de gestion des avances avec vb.net et sql server , mais je rencontre un problème au niveau de solde final, voila les requete qui affiche le solde de chaque personne :

    premier requête affiche le reste après le prélèvement
    deuxième requête affiche l'avance sans prélèvement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select employes.nom as [Nom],sum(avances.montant-prelevements.montant) as [Solde] 
    from employes,avances,solde,prelevements 
    where employes.matricule=avances.matricule and avances.id_avance=solde.id_avance and prelevements.id_prelevement=solde.id_prelevement  
    group by employes.nom,(avances.montant) 
    having sum(avances.montant-prelevements.montant) <> '0' 
     
    union all
     
    select employes.nom as [Nom],avances.montant as [Solde] 
    from avances,employes 
    where employes.matricule=avances.matricule and avances.id_avance not in (select id_avance from solde)
    la question que je propose comment je veux avoir la somme de deux requête car l’exécution il me donne
    par exemple :

    Nom solde
    saidovicth 500
    saidovicth 300


    comment je veux faire pour avoir

    Nom solde
    saidovicth 800

    merci de votre collaboration

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Au choix :

    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
    SELECT	employes.nom
    	, SUM([Solde]) AS [Solde]
    FROM	(
    		select employes.nom as [Nom],sum(avances.montant-prelevements.montant) as [Solde] 
    		from employes,avances,solde,prelevements 
    		where employes.matricule=avances.matricule and avances.id_avance=solde.id_avance and prelevements.id_prelevement=solde.id_prelevement  
    		group by employes.nom,(avances.montant) 
    		having sum(avances.montant-prelevements.montant) <> '0' 
     
    		union all
     
    		select employes.nom as [Nom],avances.montant as [Solde] 
    		from avances,employes 
    		where employes.matricule=avances.matricule and avances.id_avance not in (select id_avance from solde)
    	) AS S
    Ou :

    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
    WITH
    	CTE AS
    	(
    		select employes.nom as [Nom],sum(avances.montant-prelevements.montant) as [Solde] 
    		from employes,avances,solde,prelevements 
    		where employes.matricule=avances.matricule and avances.id_avance=solde.id_avance and prelevements.id_prelevement=solde.id_prelevement  
    		group by employes.nom,(avances.montant) 
    		having sum(avances.montant-prelevements.montant) <> '0' 
     
    		union all
     
    		select employes.nom as [Nom],avances.montant as [Solde] 
    		from avances,employes 
    		where employes.matricule=avances.matricule and avances.id_avance not in (select id_avance from solde)
    	)
    SELECT	employes.nom
    	, SUM([Solde]) AS [Solde]
    FROM	CTE
    @++

  3. #3
    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 778
    Points
    30 778
    Par défaut
    Peut être tout simplement en groupant le tout...
    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
    30
    31
    SELECT  Nom
        ,   SUM(solde)  AS solde
    FROM    (   SELECT  employes.nom                                AS [Nom]
                    ,   SUM(avances.montant - prelevements.montant) AS [Solde] 
                FROM    employes
                    INNER JOIN
                        avances
                        ON  employes.matricule = avances.matricule
                    INNER JOIN
                        solde
                        ON  avances.id_avance = solde.id_avance
                    INNER JOIN
                        prelevements
                        ON  prelevements.id_prelevement = solde.id_prelevement
                GROUP BY employes.nom
                    ,   avances.montant
                HAVING  SUM(avances.montant - prelevements.montant) <> '0'
            UNION ALL
                SELECT  employes.nom    AS [Nom]
                    ,   avances.montant AS [Solde]
                FROM    avances
                    INNER JOIN
                        employes
                        ON  employes.matricule = avances.matricule 
                WHERE   avances.id_avance not in 
                        (   SELECT  id_avance 
                            FROM    solde
                        )    
            )   grp 
    GROUP BY Nom
    ;
    Au passage, cela fait des lustres qu'on n'écrit plus les jointures dans le WHERE !

    [Edit] Grillé par Elsuket, mais j'ai pris le temps de mettre la requête en forme [/edit]
    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.

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    La notation des jointures dans la clause WHERE est désuète, et on doit remplacer par celle de la norme SQL-92 :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT		E.nom AS Nom
    		, SUM(A.montant - P.montant) AS Solde
    FROM		employes AS E
    INNER JOIN	avances AS A
    			ON A.matricule = E.matricule
    INNER JOIN	solde AS S
    			ON A.id_avance=S.id_avance
    INNER JOIN	prelevements AS P
    			ON P.id_prelevement=S.id_prelevement  
    GROUP BY	E.nom, A.montant HAVING SUM(A.montant - P.montant) <> 0
    Grillé par Al1_24 !

    @++

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Décembre 2015
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    re-bonjour

    Merci beaucoup pour votre réponse rapide

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Décembre 2015
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    merci de vos réponses,le problème est résolu par Mr.Al1_24

    bonne journée à tous

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

Discussions similaires

  1. [FK-PK] Demande de solution
    Par bobuche dans le forum Développement
    Réponses: 2
    Dernier message: 06/02/2013, 16h28
  2. Réponses: 3
    Dernier message: 02/06/2010, 08h48
  3. Demande de solution
    Par Zhamy dans le forum C#
    Réponses: 7
    Dernier message: 30/04/2010, 11h35
  4. Demande de solution pour utilisation d'une base de données en reseau
    Par Virtualité dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 24/08/2008, 20h08

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