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

Adaptive Server Enterprise Sybase Discussion :

faire une somme recursive sur 1 colonne sur 2 dates consecutives et l'afficher


Sujet :

Adaptive Server Enterprise Sybase

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 53
    Points : 23
    Points
    23
    Par défaut faire une somme recursive sur 1 colonne sur 2 dates consecutives et l'afficher
    Bonjour

    Je souhaite faire sur une même requête une somme recurisive sur une même coonne.J'ai essaye ceci mais ça marche pas

    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
     
     
     
    select distinct H.hfId as hfId,H1.mfId  as fId,sum(H.shares) as shNb,H.date as date,H.fxRate as fx 
    from tableA H,tableB b,tableC BL,tableD s,tableF H1,tableG u
     
    where H1.id=H.hfId
    AND u.id=H1.mfId
    AND  H.bk=b.id
    AND BL.bk=b.id
    AND BL.bk=H.bk
    AND b.tableDId=s.id
    AND b.tableDId=31
    AND b.desksId=2
    AND u.entityTypeId=6
    AND H.date<=(SELECT MAX(date) FROM tableA WHERE bk=b.id and b.tableDId=31 and date<='11-20-2008')
    --AND H.date<='11-20-2008'
    AND H.appvstId=2
    group by H.hfId,H1.id
    Voici le résultat obtenu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
     hfId     fId               shNb                       date                    fx    
     -------  -----------  -----------------------------  ----------------------  -------- 
     52879    52879        416994.2013576405              6/25/2004 12:00:00 AM   1        
     52879    52879        416994.2013576405              7/14/2004 12:00:00 AM   1        
     52879    52879        416994.2013576405              12/14/2006 12:00:00 AM  1        
     52879    52879        416994.2013576405              6/28/2007 12:00:00 AM   1        
     52879    52879        416994.2013576405              3/17/2008 12:00:00 AM   1        
     52879    52879        416994.2013576405              9/15/2008 12:00:00 AM   1        
     52880    52880        0.000000000029103830456733704  3/6/2003 12:00:00 AM    1        
     52880    52880        0.000000000029103830456733704  4/11/2003 12:00:00 AM   1        
     52880    52880        0.000000000029103830456733704  6/5/2003 12:00:00 AM    1        
     52880    52880        0.000000000029103830456733704  6/27/2003 12:00:00 AM   1
    Voici les jeus sans la somme sur le 1er id
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    hfId     fId                 shNb          date                    fx    
     -------  -----------  ----------------  ----------------------  -------- 
     52879    52879        444443.51851852   6/25/2004 12:00:00 AM   1        
     52879    52879        -25905.342        9/15/2008 12:00:00 AM   1        
     52879    52879        -43472.04344328   3/17/2008 12:00:00 AM   1        
     52879    52879        -73678.39381102   6/28/2007 12:00:00 AM   1        
     52879    52879        -75187.96992481   7/14/2004 12:00:00 AM   1        
     52879    52879        -121951.219       12/14/2006 12:00:00 AM  1

    Ce que voudrai avoir

    C'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pour le 6/25/2004   444443.51851852   
    pour le 9/15/2008 =444443.51851852   +(-25905.342)        
    pour le 3/17/2008 =444443.51851852   +(-25905.342)+(-43472.04344328  ) 
    etc
    Comment modifier la 1ére requête pour avoir ça.Je suppose qu'il faut découper la requête en plusieurs requêtes
    merci

  2. #2
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 168
    Points
    168
    Par défaut
    Vous pouvez vous inspirer de cette requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select suid,(select sum(suid) from syslogins s2 where s2.suid<=s1.suid) from syslogins s1

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 53
    Points : 23
    Points
    23
    Par défaut
    Je teste et te reviens
    thanks

  4. #4
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    Quelle est la version de votre ASE ? Selon la version, les tables dérivées ne sont pas supportées

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 53
    Points : 23
    Points
    23
    Par défaut
    Sysbase 11/12/15 TDS5.5

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 53
    Points : 23
    Points
    23
    Par défaut
    Bonour

    J'ai testé votre requête mais ça ne marche pas.ça ne me somme pas les colonnes 2 à 2

    merci

  7. #7
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par fadace Voir le message
    Quelle est la version de votre ASE ? Selon la version, les tables dérivées ne sont pas supportées
    Il me semble qu'il ne s'agit pas d'une table dérivée, mais d'une sous-requête (j'ai testé sur une version < 12.5.3, la 12.5.0.3)

  8. #8
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par 461219 Voir le message
    Bonour

    J'ai testé votre requête mais ça ne marche pas.ça ne me somme pas les colonnes 2 à 2

    merci
    Effectivement, il s'agit d'un cumul, je n'avais pas bien saisi votre demande.
    C'est possible en utilisant un curseur, ou en utilisant max et une sous requête.

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 53
    Points : 23
    Points
    23
    Par défaut
    Salut Roller
    je galére grave si tu peux me donner juste le début avec le curseur ou le max+sous requête ce serait great.

  10. #10
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 168
    Points
    168
    Par défaut
    Avec une autre sous-requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT     suid,(
                         SELECT sum(suid)
                         FROM syslogins s2
                         WHERE s2.suid<=s1.suid
                         AND s2.suid >= (
                                         SELECT isnull(max(suid),0)
                                         FROM syslogins s3
                                         WHERE s3.suid<s1.suid
                                         )
                         )
    FROM syslogins s1
    Le isnull est utilisé pour la première valeur.

    Avec curseur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        declare sysloginsCsr cursor for select suid from syslogins order by suid
        for read only
        declare @curSuid int, @prevSuid int
        open sysloginsCsr
        fetch sysloginsCsr into @curSuid
        while @@sqlstatus = 0
        begin
           select @curSuid,@curSuid+isnull(@prevSuid,0)
           select @prevSuid=@curSuid
           fetch sysloginsCsr into @curSuid
        end
        close sysloginsCsr
        deallocate cursor  sysloginsCsr

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 53
    Points : 23
    Points
    23
    Par défaut
    Merci

    je vais tester et te reviens.

  12. #12
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 53
    Points : 23
    Points
    23
    Par défaut
    La sous requête ne semble pas macrher et mets trop de temps. Par contre le curseur marche par contre je voudrai stocket le résultat dans une table temporaire et l'utiliser aprés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     declare @curShares int, @prevShares int
            open hfTradeCsr 
            fetch hfTradeCsr INTO @curShares 
            while @@sqlstatus = 0
            begin
               SELECT @curShares as currSum,@curShares+isnull(@prevShares,0) as total 
                  SELECT @prevShares=@curShares+isnull(@prevShares,0)
                 fetch hfTradeCsr INTO @curShares
            end
            close hfTradeCsr
            deallocate cursor  hfTradeCsr
    j'ai essayé de rajouter un into ##tamp mais ça plante à chaque endroit et si je le rajoute dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       SELECT @curShares as currSum,@curShares+isnull(@prevShares,0) as total
    Il va être cée plusieurs fois et peter une erreur.

    merci

  13. #13
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 168
    Points
    168
    Par défaut
    Il faut créer la table temporaire (#temp) au tout début, et faire des
    insert into #temp values (...)
    La manipulation des tables temporaire et une des base du dev sous sybase, je vous conseille de lire la doc en ligne (sybooks.sybase.com) qui est claire et détaillée.

Discussions similaires

  1. [Débutant] [VB.Net] Grouper sur 2 colonnes et faire une somme.
    Par thibab dans le forum Linq
    Réponses: 1
    Dernier message: 23/09/2012, 11h03
  2. [SP-2010] Faire une somme sur une colonne d'une liste
    Par sebfreu dans le forum SharePoint
    Réponses: 6
    Dernier message: 19/01/2012, 11h05
  3. [XL-2003] faire une somme que sur les colonnes visibles
    Par mimilll dans le forum Excel
    Réponses: 21
    Dernier message: 27/08/2009, 12h10
  4. Faire une somme en se basant sur une valeur donnée
    Par caco92 dans le forum Formules
    Réponses: 2
    Dernier message: 09/10/2008, 11h39
  5. Réponses: 3
    Dernier message: 09/05/2007, 11h43

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