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

MS SQL Server Discussion :

probleme de requete (SUM)


Sujet :

MS SQL Server

  1. #1
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 253
    Points
    28 253
    Par défaut probleme de requete (SUM)
    Bonjour,

    J'ai un problème qui me prend la tête et qui est au dessus de mes capacités intellectuelles

    j'ai une table (simplifiée ici) qui contient des reglements (paiements). la table est sous cette forme

    Id_du_reglement
    | montant | date_encaissement | id_dossier


    J'ai besoin de faire une procedure stockée qui me renvoi pour chaque dossier, la somme des reglements ET la somme des reglements encaissés.
    exemple:
    dossier1 | 3000(de reglements) | 2000(encaissés)
    dossier2 | 1000(de reglements) | 400(encaissés)
    Maintenant, je ne sais pas vraiment comment je pourrai obtenir ce resultat. Je sais que j'ai un SELECT contenant deux SUM(), l'un de tous les reglements, et un SUM() de tous les reglements dont la date est passée.
    j'arrive bien a faire deux requetes différentes puisque la clause where du second ne doit pas s'appliquer au premier, mais je ne trouve pas comment le faire d'une seule requete. une sorte d'union mais de colonnes

    d'avance merci de toute aide.

  2. #2
    Membre habitué Avatar de Cobaye
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    Points : 154
    Points
    154
    Par défaut
    je le ferai en trois requetes
    la première tu récupère les tous les rêglements

    SELECT sum(montant) as reglement, dossier FROM tatable que j'appel requete1

    la deuxième les rêglements encaissés
    SELECT sum(montant) as encaisse, dossier FROM tatable WHERE date_encaissement<now() que j'appel requete2

    et un requete3
    SELECT reglement, encaisse, dossier FROM requete1 LEFT JOIN requete2 ON requete1.dossier = requete2.dossier

    dossier étant l'élément en commun des deux requetes
    voila

  3. #3
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 253
    Points
    28 253
    Par défaut
    merci, on m'a donné cette requete qui marche mais qui est un peu degueulasse ^^
    SELECT dos_id, SUM(recu) AS Expr1, SUM(encaissee) AS Expr2
    FROM (SELECT dos_id, SUM(rgd_montant) AS recu, 0 AS encaissee
    FROM dbo.T_REGLEMENT_DETAIL a
    WHERE a.dos_id = '192160'
    GROUP BY dos_id
    UNION
    SELECT dos_id, 0 AS recu, SUM(rgd_montant) AS encaissee
    FROM dbo.T_REGLEMENT_DETAIL b
    WHERE b.dos_id = '192160' AND b.temp_date_enc < getdate()
    GROUP BY dos_id) DERIVEDTBL
    GROUP BY dos_id

    le select imbriqué renvoi un tableau du style

    12123 |1231 | 0
    12123 | 0 | 12312
    et je peux donc faire la somme directement. je crois que je vais le garder temporairement car ca me saoule.

    J'étais parti sur ta solution, donc je te remerci par contre j'ai bloqué avant la fin ^^. mon collègue dit avoir tenté lameme manière mais des reglements manquaits, ptete à cause du left join.
    je garde donc ton code sous la main pour m'y remettre plus tard.

    MERCI

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT dos_id, 
           SUM(rgd_montant) AS reglement, 
           SUM(CASE WHEN date_encaissement < getdate() THEN rgd_montant ELSE 0 END) AS Encaisse
    FROM dbo.T_REGLEMENT_DETAIL 
    WHERE a.dos_id = '192160' 
    GROUP BY dos_id

  5. #5
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 253
    Points
    28 253
    Par défaut


    j'ai oublié de préciser que mon problème ici (le post) n'est qu'une sous-requete et que j'en avais plusieurs du meme style à "accrocher" ensemble. J'ai d'ailleurs passé 1heure à faire la grosse requete, puis 20 minutes pour l'optimiser.

    je teste alors la tienne (sans conviction) ==> ca marche, puis j'ai mis 5 minutes pour refaire la grosse requete en partant de ton "noyau" et sans l'optimiser, c'est deux fois plus rapide.



    un gros


    ps: je ne connaissais meme pas le CASE dans un aggregat je retourne me flageller pour mon ignorance

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par pharaonix
    je retourne me flageller pour mon ignorance
    Non, non, laisse moi faire, j'adore cela

  7. #7
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 253
    Points
    28 253
    Par défaut
    c'est bien parce que c'est toi


    bon j'ai un peu changé la requete et il y a un cas particulier pour lequel ça ne marche pas parfaitement (meme si le resultat est logique)
    voilà ma nouvelle requete


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT  d.dos_id, 
                 d.dos_principal, 
                 d.dos_frais_lettre, 
                 d.dos_interet_retard, 
                 SUM(a.rgd_montant) AS recu, 
                 SUM(CASE WHEN temp_date_enc &amp; getdate() THEN rgd_montant ELSE 0 END) AS encaisse
    FROM    dbo.T_REGLEMENT_DETAIL AS a RIGHT OUTER JOIN
                 dbo.T_DOSSIER AS d ON a.dos_id = d.dos_id
    GROUP BY d.dos_id, d.dos_principal, d.dos_frais_lettre, d.dos_interet_retard, d.deb_id
    HAVING      (d.deb_id = @SearchId)
    en résumé. j'ai une table dossier (T_dossier) qui contient les dossiers des clients. Chaque dossier peut avoir 0 ou plusieurs reglements.
    dans le cas d'aucun reglements, la requete me sort

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dos_di   principal         frais1     frais2    recu    encaisse
    372756	1247.1107	0.0000	0.0000	NULL	0.0000
    372806	  729.8893	 0.0000	 0.0000	 NULL	 0.0000

    existe un moyen propre de remplacer le null par 0? je vais recupérer le tout dans un dataset (en .net) et je pourrais gérer le null dans le code, mais s'il était possible de remplacer le NULL par un 0, ca me facilerait les choses

    merci d'avance

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227

  9. #9
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Remarque (mais non testé) :
    ton HAVING (d.deb_id = @SearchId) peut s'exprimer dans un WHERE d.deb_id = @SearchId, il me paaît plus efficace de sélectionner les bonnes lignes, puis de les grouper, plutôt que de grouper toutes les lignes, puis de choisir les bons groupes

  10. #10
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 253
    Points
    28 253
    Par défaut
    merci, le COALESCE marche nickel pourtant, d'apres la msdn, je vois pas le rapport. enfin, il n'est pas expliqué que 0 remplacera la valeur non nulle.
    mais bon, ca marche parfaitement

    pour le having,c'est simple, je met toujours des WHERE, mais le nouvel éditeur de requete sql (intégré a Visual Studio 2005) aime bien optimiser à sa sauce et ne garde jamais ton code

    bref, tout est parfait dans le meilleur des monde, je te remerci donc grandement et je t'autorise à en remettre un ptit peu


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

Discussions similaires

  1. [SQL] - Probleme de requete avec SUM
    Par toxycyty dans le forum Langage SQL
    Réponses: 9
    Dernier message: 05/02/2009, 15h33
  2. probleme requete SUM
    Par pwd75 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 18/06/2008, 11h57
  3. Probleme avec requete et sum
    Par Treuze dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/01/2006, 17h28
  4. probleme de requete
    Par LineLe dans le forum ASP
    Réponses: 8
    Dernier message: 17/09/2003, 16h47
  5. Probleme de requete
    Par misterbillyboy dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/07/2003, 08h24

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