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 cumulée


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 104
    Points : 32
    Points
    32
    Par défaut Somme cumulée
    Bonjour,
    Je suis sur sql sever 2008
    j'ai une table (dessous) dont je veux faire une colonne de cumul faisant la somme de "qt" pour chaque identifiant : " id_art " en suivant l'ordre décroissant de "date_mvt" pour arriver aux résultats dessous

    id | date_mvt   |   qt | id_art | cumul
     5 | 10/10/2013 | -102 |      9 |  -102
    13 | 09/10/2013 |  100 |    182 |   100
    14 | 10/10/2013 | - 10 |    182 |    90
    15 | 10/10/2013 | - 40 |    182 |    50
    16 | 12/10/2013 |   80 |    182 |   130
    12 | 09/10/2013 |   20 |    415 |    20
    17 | 12/10/2013 |   30 |    415 |    50
    J'ai essayé avec ça sans résultats .!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select id, date_mvt, qt, id_art,
           (select sum(qt)
            from t2
            where t2.id_art      = @t.id_art and
                  t2.id_det_mvt <= @t.id_det_mvt
           ) as cumul 
     
     
    from @t;
    Merci d'avance

  2. #2
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    A quoi correspondent T2 et @t dans votre requete ?

    Sur le principe, il vous faut faire une auto-jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT Ref.id, ref.date_mvt, ref.qt, ref.id_art, SUM(Somme.qt) AS Cumul
    FROM LaTable AS Ref
    INNER JOIN LaTable AS  Somme
    	ON	Somme.id_art = Ref.id_art
    	AND	(Somme.date_mvt < Ref.date_mvt
    		OR
    			(Somme.date_mvt = Ref.date_mvt
    			AND
    			Somme.id <= Ref.id)
    		)
    GROUP BY Ref.id, ref.date_mvt, ref.qt, ref.id_art
    ORDER BY ref.id_art, ref.date_mvt
    Notez que pour traiter le cas des dates identiques, je m'appuie sur l'ID pour l'ordre, mais vous pouvez (et devriez !) faire autrement

  3. #3
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Je vous conseil de regarder la fonction SUM( champ ) OVER()

    Ex :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        ,SUM(Prix) OVER ( PARTITION BY id_art
                          ORDER BY date_mvt 
                          ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING ),1) AS Total

    Il est possible de faire du cumul ligne à ligne selon des critères précis (par exemple des types de vente)

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  4. #4
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    tout à fait Lyche,

    Malheureusement, cette solution ne fonctionne que depuis SQL Server 2012

  5. #5
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    tout à fait Lyche,

    Malheureusement, cette solution ne fonctionne que depuis SQL Server 2012
    tu es certain que ça ne fonctionne pas sous 2008? je n'ai pas SQL Server sous la main je ne peux pas vérifier. En plus j'ai un 2012 à la maison

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je confirme Lyche, les fonctions analytiques n'ont été complètement implémentées qu'à partir de SQL-Server 2012.

    Pour la solution pré-2012, je propose une simple jointure :
    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
    With MaTable (id, date_mvt, qt, id_art) as
    (
    select  5, CONVERT(date, '10/10/2013', 103), -102,   9 union all
    select 13, CONVERT(date, '09/10/2013', 103),  100, 182 union all
    select 14, CONVERT(date, '10/10/2013', 103), - 10, 182 union all
    select 15, CONVERT(date, '10/10/2013', 103), - 40, 182 union all
    select 16, CONVERT(date, '12/10/2013', 103),   80, 182 union all
    select 12, CONVERT(date, '09/10/2013', 103),   20, 415 union all
    select 17, CONVERT(date, '12/10/2013', 103),   30, 415
    )
      select t1.id, t1.date_mvt, t1.qt, t1.id_art, SUM(t2.qt) as cumul
        from MaTable as t1
        join MaTable as t2
          on t1.id_art    = t2.id_art
         and t1.date_mvt >= t2.date_mvt
         and t1.id       >= t2.id -- Pour différencier les id 13 et 14 qui ont la même date
    group by t1.id, t1.date_mvt, t1.qt, t1.id_art
    order by t1.id_art asc, t1.id asc;
     
    id          date_mvt   qt          id_art      cumul
    ----------- ---------- ----------- ----------- -----------
    5           2013-10-10 -102        9           -102
    13          2013-10-09 100         182         100
    14          2013-10-10 -10         182         90
    15          2013-10-10 -40         182         50
    16          2013-10-12 80          182         130
    12          2013-10-09 20          415         20
    17          2013-10-12 30          415         50
    Edit : En fait c'est la même solution que aieeeuuuuu qui gère mieux le cas où il s'agit de la même date.

  7. #7
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Je confirme Lyche, les fonctions analytiques n'ont été vraiment implémentées qu'à partir de SQL-Server 2012.

    Pour la solution pré-2012, je propose une simple jointure :
    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
    With MaTable (id, date_mvt, qt, id_art) as
    (
    select  5, CONVERT(date, '10/10/2013', 103), -102,   9 union all
    select 13, CONVERT(date, '09/10/2013', 103),  100, 182 union all
    select 14, CONVERT(date, '10/10/2013', 103), - 10, 182 union all
    select 15, CONVERT(date, '10/10/2013', 103), - 40, 182 union all
    select 16, CONVERT(date, '12/10/2013', 103),   80, 182 union all
    select 12, CONVERT(date, '09/10/2013', 103),   20, 415 union all
    select 17, CONVERT(date, '12/10/2013', 103),   30, 415
    )
      select t1.id, t1.date_mvt, t1.qt, t1.id_art, SUM(t2.qt) as cumul
        from MaTable as t1
        join MaTable as t2
          on t1.id_art    = t2.id_art
         and t1.date_mvt >= t2.date_mvt
         and t1.id       >= t2.id -- Pour différencier les id 13 et 14 qui ont la même date
    group by t1.id, t1.date_mvt, t1.qt, t1.id_art
    order by t1.id_art asc, t1.id asc;
     
    id          date_mvt   qt          id_art      cumul
    ----------- ---------- ----------- ----------- -----------
    5           2013-10-10 -102        9           -102
    13          2013-10-09 100         182         100
    14          2013-10-10 -10         182         90
    15          2013-10-10 -40         182         50
    16          2013-10-12 80          182         130
    12          2013-10-09 20          415         20
    17          2013-10-12 30          415         50
    Edit : En fait c'est la même solution que aieeeuuuuu qui gère mieux le cas où il s'agit de la même date.
    Okay!

    Pourtant j'ai utiliser les OVER(PARTITION BY..) depuis pas mal de temps (2008 au moins)
    Après, c'est vrai que j'ai pas toujours testé toutes les possibilités de cette fonction.

    Merci pour l'info,

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je confirme Lyche, les fonctions analytiques n'ont été vraiment implémentées qu'à partir de SQL-Server 2012.
    SQL Server 2012 reçoit de nouvelles fonctions analytiques, mais dès SQL Server 2008, SUM() peut être suivi de la clause OVER() comme l'indique la documentation :

    Cette fonction peut être suivie par la Clause OVER
    @++

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    OVER() oui, mais pas OVER(... ORDER BY), ce qui nous intéresse ici !

    Ma phrase prête à confusion cela dit, j'édite pour reformuler vraiment implémentées par complètement implémentées.

Discussions similaires

  1. somme cumulative su BO reporter
    Par cricri2607 dans le forum Débuter
    Réponses: 4
    Dernier message: 26/11/2008, 11h40
  2. Somme cumulative sur 12 mois glissant
    Par Ptij16 dans le forum Deski
    Réponses: 6
    Dernier message: 13/07/2007, 10h24
  3. somme cumulative sql
    Par marcdonaldwilfried dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/04/2007, 12h25
  4. ! Somme Cumulative en SQL !
    Par dom283 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2007, 18h25
  5. somme cumulative
    Par gsquad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/04/2006, 17h18

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