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

Langage SQL Discussion :

[SQL] Somme progressive


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut [SQL] Somme progressive
    Bonjour a tous,

    j'ai une table qui ressemble a ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Id          Amount           Datetime         
    -------   ------------    -----------     
    1           -50                 2011-01-22   
    2           60                  2011-02-23    
    3           90                  2011-03-01
    Et je voudrais, sélectionner toutes les donner et que pour chaque ligne, j'ai une colonne en plus [Preview] qui fasse la somme des opérations dont la date est antérieur à l’opération actuel ainsi sur l'exemple, j'aurai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Id          Amount           Datetime         Preview
    -------   ------------    -----------     -----------
    1           -50                 2011-01-22    -50
    2           60                  2011-02-23     10
    3           90                  2011-03-01     100
    Et je n'arrive pas à faire la requête, c'est pour moi une sorte de jointure mais sur la même table + un SUM mais du coup je bug un peu.

    Merci d'avance
    Cordialement,
    NeoKript

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    quel est votre sgbd ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Salut,

    Mon SGBDest SQL Server 2008,
    j'avais oublie de préciser désolé.

    Merci

  4. #4
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Effectivement, les fonctions analytiques te permettent d'appliquer des fonctions d'agrégats sur une "fenêtre" définie par la clause over :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT sum(amount) OVER(ORDER BY dtsal)
    FROM ...
    Si tu veux le calcul sur un groupe donné (genre par compte ou par client), tu ajoutes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT sum(amount) OVER(PARTITION BY compte ORDER BY dtsal)
    FROM ...

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Par défaut
    Indépendament de tout SGBD pourvu que ca accepte les requetes imbriquées, moi je l'aurais écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT A.Id, A.DateJour, (
    SELECT sum( B.Amout )
    FROM matable B
    WHERE B.DateJour <= A.DateJour
    ) AS Preview
    FROM matable A
    ORDER BY A.DateJour

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Citation Envoyé par fab256 Voir le message
    Indépendament de tout SGBD pourvu que ca accepte les requetes imbriquées, moi je l'aurais écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT A.Id, A.DateJour, (
    SELECT sum( B.Amout )
    FROM matable B
    WHERE B.DateJour <= A.DateJour
    ) AS Preview
    FROM matable A
    ORDER BY A.DateJour
    En effet, ça fonctionne a merveille.

    Je vais utiliser ceci, il n'y a pas de clauses compliquées dedans...

    Merci

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Salut et merci pour la réponse,

    j'avoue ne pas tout comprendre...

    J'ai juste essaye une requête du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT sum([amount]) OVER(ORDER BY [date])
    FROM [Table]
    Et ça me dit :

    Syntaxe incorrecte vers 'order'.
    Pourrais-tu expliquer plus en détail, ça serait sympa.

    Merci

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par NeoKript Voir le message
    Pourrais-tu expliquer plus en détail, ça serait sympa.
    SQL-Server 2008 n'implémente pas la partie ORDER dans les fonctions de fenêtrage d'agrégats, ce qui est bien dommage !

    D'après le site de Microsoft, ce ne sera toujours pas le cas pour SQL-Server 2011 :
    http://msdn.microsoft.com/en-us/libr...=SQL.110).aspx

    C'est vraiment dommage.


    Citation Envoyé par punkoff Voir le message
    Qui est horrible en terme de performance comparé aux 2 1ere requête.
    Malheureusement, pas le choix !

  9. #9
    Membre chevronné Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Par défaut
    Bonjour

    Je vous propose une solution toute simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
        MT1.Id,
        MT1.Amount,
        MT1.Datetime,
        SUM(MT2.Amount) AS Preview
    FROM MaTable MT1
      JOIN MaTable MT2 ON MT2.Datetime <= MT1.Datetime
    GROUP BY
        MT1.Id,
        MT1.Amount,
        MT1.Datetime
    Cordialement

    EDIT : Oups ! Je n'avais pas raffraichi et donc pas vu la réponse de fab256.

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Qui est horrible en terme de performance comparé aux 2 1ere requête.

    la requête de pacmann induira 1 seul scannage de table + la fonction de fenêtrage.

    La 1ere requête de fab va induire 2 scannages de tables pour arriver au même résultat, ou des scannages d'index si ceux-ci existent.

    N'ayant pas accès aux création de plan sous SQL serveur je ne saurai laquelle choisir.

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

Discussions similaires

  1. SQL somme entre deux tables
    Par MASSAKA dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/09/2010, 10h47
  2. [Requête SQL] Somme cumulée
    Par Mil17 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/08/2007, 15h31
  3. [sql] Somme de resultat
    Par VARACH dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/09/2006, 11h23
  4. [SQL] Somme de 2 colonnes dans une même table
    Par Cyrilange dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/04/2005, 08h32
  5. [SQL]Somme pour chaque colonne de requete analyse
    Par Kekou03 dans le forum Access
    Réponses: 2
    Dernier message: 12/03/2005, 03h34

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