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

  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
    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

  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
    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

  8. #8
    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
    Sinon on peux aussi le faire avec un JOIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.Id, A.DateJour, sum(B.Amout) AS Preview
    FROM matable A JOIN matable B ON B.DateJour <= A.DateJour
    GROUP BY A.Id, A.DateJour
    ORDER BY DateJour

  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.

  11. #11
    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 !

  12. #12
    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
    Comme quoi, il n'y a pas que MySQL qui oublie d'implémenter les fonctionnalités sympas, hein

  13. #13
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Heu j'ai du louper un épisode... mais... quel est l’intérêt de trier avant de faire une somme ?

    pour moi :

    3 + 2 + 5 = 2 + 3 + 5

    de même le max/min/avg... d'une liste de valeurs est le même, que les valeurs soient triées ou non...

  14. #14
    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
    L'intérêt c'est justement la somme cumulative. On n'est pas obligé de trier sur la valeur, on peut le faire sur une autre colonne.

    Par exemple, pour calculer un chiffre d'affaires mensuel avec un cumul au fur et à mesure de l'année, ça donnerait ça (écrit à la mode SQL-Server) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      SELECT Year(MaDate)                                                       as Annee
           , Month(MaDate)                                                      as Mois
           , sum(CA)                                                            as CA_mensuel
           , sum(CA) over(partition by Year(MaDate) order by Month(MaDate) ASC) as CA_cumul
        FROM MesVentes
    GROUP BY Year(MaDate)
           , Month(MaDate)
    ORDER BY Year(MaDate)  ASC
           , Month(MaDate) ASC
    Comme précisé par punkoff, il n'y a qu'un seul table scan, avec SQL-Server il faut faire une théta jointure plus coûteuse.

+ 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