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 :

Somme des produits de 3 lignes


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Somme des produits de 3 lignes
    Bonjour j’espère que vous vous portez bien
    j'ai un petit soucis
    j'ai 2 tables : consommation et caisse
    consommation [idConso,dateConso,Matricule,montantEntree,MontantResistance,montantDessert,qteEntre,qteResistance,qteDessert,obsConso]
    Caisse[idCaisse,dateCaisse,matricule,MontantCredit,Observation]

    le but ici est de faire un relevé des différents mouvement de la personne concerné (matricule)
    lorsque la personne consomme la caisse débite MontantCredit.
    la personne peut recharger son compte alors MontanCredit est crédité et observation est renseigné dans tous les cas.

    tout marche à merveille
    je voudrais seulement avoir un relevé des opérations de la personne concernée à une date donnée en mentionnant aussi son solde à cette date.
    pour ce faire j'ai j'ai créé cette procedure stockée :
    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
    32
    33
    34
    35
    36
     
    SELECT
     
          [DateCaisse] as "Date Operation"
          ,[Matricule]
     
          ,[MontantCredit] as "Montant Operation"
         ,case Observations
    		when '' then 'RECHARGEMENT' 
    		else caisses.Observations
    		end
    		AS NatureOperation
     
          --,[Observations] as "Type Operation"  
          --,[MontantAncienSolde]   <> ' '
          --,[MontantNouveauSolde]
     
      FROM [Cantine].[dbo].[Caisses]
        where 
    	Matricule=@MatriculEmpl
      union
     
      SELECT 
     
          [DateConsommation] as "Date Operation"
          ,[Matricule]
     
          ((MontantEntree*QteEntree + MontantDesert*Qtedessert + MontantResistance*QteResitance) *-1) as "Montant Operation"
    	, case observations
    		when '' then 'CONSOMMATION' 	
    		else Consommations.Observations
    	  end
    		AS NatureOperation
      FROM [Cantine].[dbo].[Consommations]
      where 
    	Matricule=@Matricul
    le soucis c'est que je n'arrive pas à faire la somme de "montant Operation" puisque c'est un alias.
    comment alors recuperer la somme

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Vous pouvez faire quelque chose de ce genre :
    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
    With T1 as
        (SELECT [MontantCredit] as MT
         FROM [Cantine].[dbo].[Caisses]
         where Matricule=@MatriculEmpl
           and DateCaiss=@Datecaiss)
     
        ,T2 as
        (SELECT ( (MontantEntree*QteEntree)
                 +(MontantDesert*Qtedessert)
                 +(MontantResistance*QteResitance)
                )*-1 as MT
         FROM [Cantine].[dbo].[Consommations]
         where Matricule=@Matricul
           and DateCaiss=@Datecaiss)
    SELECT T1.MT + T2.MT as "Solde"
    Quelques remarques :
    • il manquait une virgule dans votre requete d'origine avant "((MontantEntree*QteEntree + MontantDesert..."
    • comme vous fournissez les valeurs de date et de matricule, le n'est pas utile de les transporter dans le select, c'est pourquoi je les ai enlevées
    • vu que vous voulez le solde pour une journée, j'ai ajouté le filtre date dans les 2 CTE
    • peut être faut il soustraire les 2 montants et non les additionner, à vous de corriger si besoin
    • pour le confort de lecture, j'ai ajouté des parenthèses dans les calculs, certes la multiplication est prioritaire par rapport à l'addition, mais ça me semble plus clair ainsi

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    ok je teste et je vous fais signe
    merci

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    SELECT T1.MT + T2.MT as "Solde"
    erreur sur cette ligne : expression de table commune définie, mais non utilisée.
    je chercher plus d'info sur cette erreur...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    C'est simple dans la requête proposée par Escartefigue il manque la clause from, mais je ne sais pas ce qu'il avait en tête, donc je ne saurais dire s'il faut un cross join ou autre chose.

    Cordialement
    Soazig

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,
    Oui désolé, j'ai oublié de copier la denière ligne

    Si T1 et T2 sont mono-lignes, ce qui est normalement le cas puisqu'on filtre sur un matricule et une date le cross-join répond au besoin
    Ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WITH [. . .]
    SELECT T1.MT + T2.MT as "Solde"
    FROM T1 CROSS JOIN T2
    Si on veut pouvoir utiliser la requete pour plusieurs individus il faut ajouter le matricule dans les CTE et faire une jointure sur le matricule

    J'avais a priori éliminé le cas de null, car il me semble que dans un restaurant d'entreprise, toute personne qui consomme a préalablement alimenté sa carte, et personne n'alimente jamais son compte sans prendre de repas. Si cette hypothèse est fausse, il faut alors faire une jointure outer entre les 2 CTE et gérer les cas de montants nuls avec coalesce

  7. #7
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    je me, retrouve avec autant de lignes qu'il y a d’enregistrements or ce n'est qu'une seule ligne je veux
    en somme je veux le solde
    solde= montantCredit - (sum (qteDessert*montantDessert)+(qteEntree*montantEntree)+(qteResistance*montantResistance))

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    en ce cas ajoutez un groupage et une somme soit dans les CTE, soit dans la requete finale

Discussions similaires

  1. la somme des lignes
    Par DJERDJAR YACINE dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/07/2007, 19h24
  2. Afficher la somme des lignes d'une table
    Par DJERDJAR YACINE dans le forum Bases de données
    Réponses: 5
    Dernier message: 23/07/2007, 19h18
  3. select la somme des produits
    Par yasmine* dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 30/04/2007, 22h51
  4. Somme des valeurs de certaines lignes
    Par Tartenpion dans le forum Langage SQL
    Réponses: 6
    Dernier message: 16/02/2006, 16h46
  5. Réponses: 2
    Dernier message: 09/01/2006, 16h10

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