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 :

Calcul pourcentage d'évolution [2008R2]


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 Calcul pourcentage d'évolution
    Bonjour tout le monde..

    Je reviens vers vous à nouveau pour un peu d'aide.

    Sur la base du code ci-dessous, je souhaiterai ajouter une nouvelle colonne qui contiendrai le pourcentage d'évolution...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select DISTINCT
    					GType
    					, Datepart(MM,datreal) as Mois
    					, sum(Qreb) OVER(PARTITION BY GType, mois) AS sREB
     
    			 from dbo.CID06_Analyse_des_Rebuts
    				where datreal >= DATEADD(YEAR , DATEDIFF(YEAR, 0, GETDATE()), 0) 
    				and UP = '5'
    				and Qbon + Qreb > 0
     
    			 group by Gtype,datreal, mois,Qreb 
    			 order by Gtype, mois

    Résultat de la requête ci-dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    GType	Mois	sREB
    AUBAE	1	3972
    AUBAE	2	2980
    AUBAE	3	4768
    AUBAE	4	3296
    AUBAE	5	3070
    AUBAE	6	2540
    AUBAE	7	3016
    AUBAE	8	2469
    AUBAE	9	3793

    Soit le calcul du pourcentage d'évolution entre le mois 1 et 2, 2 et 3, 3 et 4, etc..


    Exemple :
    "1" : pas de donnée puisque pas de mois précédent
    "2" : -24.9
    "3" : +60
    "4" : -30.8
    ...

    Merci!

  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,

    Vous avez fait un curieux mélange des genres du GROUP BY et de la fonction analytique, assaisonné au DISTINCT...

    Il me semble que votre requete se réume comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT 
    	GType
    	, Datepart(MM,datreal) AS Mois
    	, sum(Qreb) AS sREB
    FROM dbo.CID06_Analyse_des_Rebuts
    WHERE datreal >= DATEADD(YEAR , DATEDIFF(YEAR, 0, GETDATE()), 0) 
    	AND UP = '5'
    	AND Qbon + Qreb > 0
    GROUP BY Gtype,Datepart(MM,datreal)
    ORDER BY Gtype, mois
    Ensuite, pour calculer l'évolution, il vous faut connaitre la valeur précédente. Comme vous êtes en version 2008, vous ne disposez pas des fonctions analytiques LEAD et LAG, il vous faudra donc faire sans.

    Que donne 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
    25
    26
    27
    28
    29
    30
    31
    32
     
    WITH CTE AS (
    	SELECT 
    		GType
    		, Datepart(MM,datreal) AS Mois
    		, sum(Qreb) AS sREB
    	FROM dbo.CID06_Analyse_des_Rebuts
    	WHERE datreal >= DATEADD(YEAR , DATEDIFF(YEAR, 0, GETDATE()), 0) 
    		AND UP = '5'
    		AND Qbon + Qreb > 0
    	GROUP BY Gtype,Datepart(MM,datreal)
    ),
    Prec AS (
    	SELECT 
    		GType
    		, Mois
    		, sREB
    		, CASE WHEN Mois%2 = 1 
    			THEN
    				MAX(CASE WHEN Mois%2 = 0 THEN sREB END) OVER(PARTITION BY Mois/2)
    			ELSE
    				MAX(CASE WHEN Mois%2 = 1 THEN sREB END) OVER(PARTITION BY (Mois-1)/2)
    		END		AS Precedent	
    	FROM CTE
    )
    SELECT
    		GType
    		, Mois
    		, sREB
    		, (sREB - Precedent) / (Precedent / 100.) AS Evolution
    FROM Prec
    ORDER BY Gtype, mois

  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
    Ah.. le WITH CTE.. je savais bien que c'était par là la solution...

    Concernant ma tambouille ...
    Le DISTINCT : Parce que sans, la requête retoune prés de 10000 lignes.
    Le OVER PARTITION : Parce que sans, j'obtient une SUM des 10000 lignes.

    Voici le résultat de votre version :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    GType	Mois	sREB
    AUBAE	1	17685
    AUBAE	2	13780
    AUBAE	3	18290
    AUBAE	4	13384
    AUBAE	5	13601
    AUBAE	6	10831
    AUBAE	7	12738
    AUBAE	8	7653
    AUBAE	9	16616
    C'est pas la même chose et surtout pas les bons chiffres.
    Bref, en tout cas merci du coup de pouce aieeeuuuuu !! Ca réponds parfaitement! J'ai encore bcp de chemin pour avoir ce niveau!

    Juste une question, je ne comprends pas le "Mois%2"..

  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
    Est-ce que votre table contiendrait une colonne "mois" ?
    Dans ce cas il faudrait le rajouter dans le group by...

    bref, dans tous les cas, vous pouvez remplacer la première CTE par votre propre requete.

    pour ce qui est du Mois%2, il s'agit du modulo 2 de la colonne Mois.
    J'explique plus en détail le fonctionnement de cette émulation des LEAD/LAG dans ce post

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

    Encore besoin d'un p'tit coup de pouce.. Car le code fonctionne que pour les 9 premières lignes..

    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
    29
    30
    31
    32
    33
    34
    35
    36
    WITH CTE AS (
    	select DISTINCT
    					GType
    					, Datepart(MM,datreal) as Mois
    					, sum(Qreb) OVER(PARTITION BY GType, mois) AS sREB
     
    			 from dbo.CID06_Analyse_des_Rebuts
    				where datreal >= DATEADD(YEAR , DATEDIFF(YEAR, 0, GETDATE()), 0)  -- Annee en cours
    				and UP = '5'
    				and Qbon + Qreb > 0
     
    			 group by Gtype,datreal,mois,Qreb --order by gtype,mois
     
    ),
    Prec AS (
    	SELECT 
    		GType
    		, Mois
    		, sREB
    		, CASE WHEN Mois%2 = 1 
    			THEN
    				MAX(CASE WHEN Mois%2 = 0 THEN sREB END) OVER(PARTITION BY Mois/2)
    			ELSE
    				MAX(CASE WHEN Mois%2 = 1 THEN sREB END) OVER(PARTITION BY (Mois-1)/2)
    		END		AS Precedent	
    	FROM CTE
    )
    SELECT
    		GType
    		, Mois
    		, sREB
    		, Precedent
    		, ISNULL((sREB - Precedent) / (Precedent / 100.),'0') AS Evolution
     
    FROM Prec
    ORDER BY Gtype, mois
    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
    GType	Mois	sREB	Precedent	Evolution
    AUBAE	1	3972	NULL	0.00000000000000000
    AUBAE	2	2980	3972	-24.97482376636455186
    AUBAE	3	4768	2980	60.00000000000000000
    AUBAE	4	3296	4768	-30.87248322147651006
    AUBAE	5	3070	3296	-6.85679611650485436
    AUBAE	6	2540	3070	-17.26384364820846905
    AUBAE	7	3016	2540	18.74015748031496062
    AUBAE	8	2469	3016	-18.13660477453580901
    AUBAE	9	3793	2469	53.62494937221547185
    AUBDS	1	2	NULL	0.00000000000000000
    AUBDS	2	31	3972	-99.21953675730110775
    AUBDS	3	66	2980	-97.78523489932885906
    AUBDS	4	197	4768	-95.86828859060402684
    AUBDS	5	69	3296	-97.90655339805825242
    AUBDS	6	296	3070	-90.35830618892508143
    AUBDS	7	89	2540	-96.49606299212598425
    AUBDS	8	97	3016	-96.78381962864721485
    AUBDS	9	478	2469	-80.63993519643580396
    On voit bien que les valeurs de la colonne PRECEDENT sont répétées..

  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
    il faut partitionner par GTYPE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PARTITION BY GType, Mois

    quid de la colonne mois ?

  7. #7
    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
    Ca à l'air d'être bon, il me reste à gérer les DIV/0.

  8. #8
    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
    vous pouvez pour cela utiliser NULLIF

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    , ISNULL((sREB - Precedent) / (NULLIF(Precedent,0) / 100.),0) AS Evolution

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

Discussions similaires

  1. [Vxi3] Calcul du Pourcentage d'évolution
    Par EmmanuelD dans le forum Webi
    Réponses: 1
    Dernier message: 14/01/2011, 14h56
  2. Calcul pourcentage / VB ou excel ?
    Par oliver75 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/05/2007, 11h42
  3. Calcul pourcentage dans un sous formulaire
    Par kriskiller dans le forum Access
    Réponses: 9
    Dernier message: 11/07/2006, 09h45
  4. [Débutant] calculer pourcentages
    Par Satan dans le forum Access
    Réponses: 4
    Dernier message: 25/04/2006, 16h07
  5. update pour calcul pourcentage (SQL SERVER 2000)
    Par meufeu dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/09/2005, 09h04

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