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 cumulee - Over partition by [2008]


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 316
    Points : 146
    Points
    146
    Par défaut Somme cumulee - Over partition by
    Hello !
    Une fois de plus je reviens vers vous.
    J'ai besoin de faire une somme cumulée de ligne L-1 + Ligne en cours : (ligne 1 = Ligne 1, ligne 2 = Cumul L1 + Ligne 2, ligne 3 = Cumul L1+L2 + ligne 3), etc..

    L'objectif étant d'avoir une 3ième colonne qui contiendrai le tout et ainsi suivre la progression des valeurs de 0 à 23.

    Merci

    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT vue.H, vue.Cumul
     
    FROM (
    		SELECT U, DATE, HEURE,DATEPART(HH,HEURE) AS H, JL, MICRO, QP
    				,SUM(QP)
    					OVER(PARTITION BY DATEPART(HH,HEURE)) AS Cumul
     
    		FROM VPASSAGE
    		WHERE DATE = CONVERT(VARCHAR,GETDATE()-1,112) 
    		AND JL = 'EM'
    	) AS vue
     
    GROUP by vue.H, vue.Cumul
    Mon jeu de données:

    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
    H	Cumul
    0	168
    1	143
    2	271
    3	148
    4	14
    6	36
    7	74
    8	129
    9	239
    10	128
    11	270
    12	203
    13	89
    14	298
    15	133
    16	131
    17	131
    18	131
    19	262
    20	45
    22	199
    23	103

  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,

    Pour obtenir une somme cumulée, il faut spécifier la clause ORDER BY.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    OVER(ORDER BY DATEPART(HH,HEURE)) AS Cumul
    Edit : je viens de voir que êtes en version 2008, dans laquelle ce n'est pas implémenté...
    Il faut donc passer par une auto-jointure et regroupement, avec comme critère de jointure, les lignes dont l'heure est égale ou inférieure...

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 316
    Points : 146
    Points
    146
    Par défaut
    J'avais bien tenté le ORDER mais j'ai un message d'erreur que je ne parviens à passer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 102, Level 15, State 1, Line 6
    Syntaxe incorrecte vers 'order'.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 30
    Points
    30
    Par défaut
    de ce que j'ai vue dans la documentation de sql server 2008, la clause ORDER BY dans les fonctions analytiques d'agrégation n'est pas supporté sur cette version.

    elle est valide à partir de sql server 2012

  5. #5
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 316
    Points : 146
    Points
    146
    Par défaut
    Si qqun a une idée magique... Sans table temporaire..

  6. #6
    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
    J'avais édité mon post après avoir vu que vous étiez en version 2008...

    Vous pouvez faire quelque chose comme ceci (a tester...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT H, SUM(QP) AS Cumul
    FROM (
    	SELECT DISTINCT 
    		DATEPART(HH,HEURE) AS H
    	FROM VPASSAGE
    	WHERE [DATE] = CONVERT(VARCHAR,GETDATE()-1,112) 
    		AND JL = 'EM'
    ) Hr
    INNER JOIN VPASSAGE V
    	ON DATEPART(HH,HEURE) <= H
    WHERE [DATE] = CONVERT(VARCHAR,GETDATE()-1,112) 
    	AND JL = 'EM'	
    GROUP BY H
    Mais il y aurait peut être plus performant. Quelle est la structure de votre table (notamment le type de la colonne date) ? Pourquoi avoir mis la date et l'heure dans deux colonnes séparées ?

    NB : DATE est un mot réservé, et devrait être évité comme nom de colonne...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 30
    Points
    30
    Par défaut
    je ne suis pas sur que votre réponse correspond au besoin de la question initial.

    il me semble que l'on a ceci :
    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
     
    H	Cumul
    0	168
    1	143
    2	271
    3	148
    4	14
    6	36
    7	74
    8	129
    9	239
    10	128
    11	270
    12	203
    13	89
    14	298
    15	133
    16	131
    17	131
    18	131
    19	262
    20	45
    22	199
    23	103
    et que l'on veux arriver à ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    H	Cumul
    0	168
    1	311  = (168+ 143)
    2	582  = (168+ 143 + 271)
    3	730  = (168+ 143 + 271 + 148)
    ...
    voici ce que je propose

    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
     
    SELECT vue.heures, case 
                         when vue.heures = 1 then vue.c0
                         when vue.heures = 2 then vue.c1
                         ...
                         when vue.heures = 22 then vue.c22
                         when vue.heures = 23 then vue.c23
                       end
    FROM (
    		SELECT dateadd(dd, datediff(dd,0, DATE), 0), DATEPART(HH,HEURE) as heures,
               SUM(CASE WHEN DATEPART(HH,HEURE) = 0 THEN QP ELSE 0 END) as c0,
               SUM(CASE WHEN DATEPART(HH,HEURE) <= 1 THEN QP ELSE 0 END) as c1,
               SUM(CASE WHEN DATEPART(HH,HEURE) <= 2 THEN QP ELSE 0 END) as c2,
               ..
               SUM(CASE WHEN DATEPART(HH,HEURE) <= 22 THEN QP ELSE 0 END) as c22,
               SUM(CASE WHEN DATEPART(HH,HEURE) <= 23 THEN QP ELSE 0 END) as c23
    		FROM VPASSAGE
    		WHERE DATE = CONVERT(VARCHAR,GETDATE()-1,112) 
    		AND JL = 'EM'
        GROUP BY dateadd(dd, datediff(dd,0, DATE), 0), DATEPART(HH,HEURE)
    	) AS vue;

  8. #8
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 316
    Points : 146
    Points
    146
    Par défaut
    Merci pour vos réponses!

    Je vais retenir celle de aieeeuuuuu trés efficace !!

    Oui "Date" est un mot réservé mais j'en hérite.. je vais le mettre entre [].
    Quant à DATE et HEURE séparés, pareil c'est un héritage..

    Bref, merci du coup de main et bon WE à tous!

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

Discussions similaires

  1. Over Partition By
    Par logiciel_const dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/02/2011, 16h01
  2. [A-07] Somme CUMULEE mensuelle
    Par texasred dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/12/2008, 01h20
  3. Postgre Over Partition By
    Par the java lover dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 01/08/2008, 09h11
  4. Over Partition SQL Server
    Par dosilbr dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/06/2008, 09h08
  5. Over Partition By - Doublon
    Par zizou771 dans le forum SQL
    Réponses: 8
    Dernier message: 23/01/2008, 18h26

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