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 :

Pb de cumul ds une PS


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 22
    Par défaut Pb de cumul ds une PS
    Bonjour à tous,

    J'aurais besoin d'aide sur une requete qui me retourne 2 ligne sur lequels je souhaiterais faire un cumul.Pour etre un peu plus claire j'ai 3 champ Codevaleur, Quantite et Sens, je veux en fonction du sens (Achat ou vente) signe ma quantite et faire le cumul après pour m eretrouver avc une seul ligne pour un code valeur donné. et je coince dessus. voilà ma PS à compléter qui utilise un curseur sachant que je ne c pas si c la bonne solution sous SQLserver2000.
    Merci de votre aide

    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
    DECLARE @Titre varchar(9)
    DECLARE @Sens varchar(1)
    DECLARE @Qte int
     
    DECLARE Curs_TOPS CURSOR FOR
    --Séléction des instructions
    SELECT T_Titres.CodeValeur, SUM(CONVERT(decimal, REPLACE(T_Operations.Quantite, ',', '.'))) as Qte,T_Operations.Sens
    FROM T_Contreparties INNER JOIN
    T_Operations ON T_Contreparties.CodeCtpie = T_Operations.CodeCtpie RIGHT OUTER JOIN
    T_Titres ON T_Operations.CodeValeur = T_Titres.CodeValeur
    GROUP BY T_Operations.Sens, T_Titres.CodeValeur
    BEGIN
    OPEN Curs_TOPS
    END
     
    FETCH Curs_TOPS INTO @Titre,@Qte,@Sens
    WHILE @@FETCH_STATUS<>-1
    BEGIN
    if @Sens='A'
    set @Qte=@Qte
    IF @Sens='V'
    set @Qte=@Qte*-1
     
    FETCH Curs_TOPS INTO @Titre,@Qte,@Sens
    END
     
    CLOSE Curs_TOPS
    DEALLOCATE Curs_TOPS

  2. #2
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    salut,

    que penses-tu d'ajouter dans ton SELECT qqch comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SUM(CASE T_Operations.Sens 
    WHEN 'V' THEN CONVERT(decimal, REPLACE(T_Operations.Quantite, ',', '.'))*-1 
    ELSE CONVERT(decimal, REPLACE(T_Operations.Quantite, ',', '.')) 
    END as Qte
    ... en enlevant le GROUP BY T_Operations.sens

    code non testé, peut-être à adapter.

  3. #3
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Voici un code suffisamment optimisé :

    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
    --Créer une table T_Signe
    Create Table T_Signe(
       sig_code char(1) not null primary key,
       sig_sens int not null
    );
    go
    --Ajouter les deux codes :
    insert into t_signe(sig_code,sig_sens)
    values('A',1);
    go
    insert into t_signe(sig_code,sig_sens)
    values('V',-1);
    go
    --Enfin notre requête miracle, je suppose pour comptabiliser ton stock
    SELECT T.CodeValeur, SUM(CONVERT(decimal, REPLACE(O.Quantite, ',', '.'))*sig_sens) as Qte
    FROM T_Contreparties C INNER JOIN T_Operations 
                      ON C.CodeCtpie = O.CodeCtpie 
                RIGHT OUTER JOIN T_Titres T 
                      ON O.CodeValeur = T.CodeValeur
                                   JOIN T_SIGNE S
                      ON S.sig_id=O.Sens
    GROUP BY T.CodeValeur
    Je regrette que tu puisses choisir le type varchar pour stocker la quantité au lieu du type int, ce qui t'éviterais de passer par replace...
    Bonne chance.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

Discussions similaires

  1. Champ Cumul sur une table
    Par Faro dans le forum Requêtes et SQL.
    Réponses: 18
    Dernier message: 13/06/2007, 01h30
  2. [XI]calcul de cumul depuis une date
    Par lamyae_84 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 04/05/2007, 23h20
  3. cumul sur une table liée
    Par pierrot67 dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/11/2006, 19h45
  4. Afficher un cumul ou une somme dans un état
    Par Alex063 dans le forum Access
    Réponses: 4
    Dernier message: 07/02/2006, 15h37
  5. Stocker un cumul dans une tabel ?
    Par brice01 dans le forum Schéma
    Réponses: 4
    Dernier message: 07/02/2006, 12h12

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