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 :

Décrémenter une somme selon une dimension et selon une condition [2005]


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Developpeur d'outils de pilotage
    Inscrit en
    Décembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Developpeur d'outils de pilotage

    Informations forums :
    Inscription : Décembre 2014
    Messages : 19
    Points : 13
    Points
    13
    Par défaut Décrémenter une somme selon une dimension et selon une condition
    Bonjour à toutes et tous,

    Tout d'abord, je vous remercie de vous attarder sur ma problématique. Elle est la suivante:

    Je souhaite décrémenter un total à partir de quantité selon une dimension et un critère spécifique.
    Un exemple vaut mieux que mille mots
    J'ai les données suivantes (Cf pièce jointe):
    Prénom Couleur Sous Total pièces
    François Bleu 21 200
    Pierre Rouge 18
    Jacques Bleu 11
    Emilie Bleu 10
    Richard Rouge 11
    Christelle Bleu 21

    Ce que je souhaite c'est enlever, à mon total 200, les sous des personnes bleus et je souhaite décrémenter pas à pas, ce qui donnerais le résultat suivant :
    Prénom Couleur Sous Résultat attendu Total pièces
    François Bleu 21 179 200
    Pierre Rouge 18 null
    Jacques Bleu 11 168
    Emilie Bleu 10 158
    Richard Rouge 11 null
    Christelle Bleu 21 137
    Pour l'instant, j'ai la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select TotalPièces - sum(Sous) OVER(PARTITION BY Prénom ORDER BY ...) as "Résultat attendu" From Table
    Je n'arrive pas à savoir comment ignorer les personnes rouges.

    Merci par avance de votre aide.
    Pour le contexte je suis sur SQL Server 2005
    Fichiers attachés Fichiers attachés

  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 ne prendre en compte que les bleus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sum(CASE WHEN Couleur = 'bleu' THEN Sous END) OVER(PARTITION BY Prénom ORDER BY ...)
    Cela dit, sauf erreur de ma part, un SUM OVER(...ORDER BY...) ne fonctionnera pas sous 2005 (seulement à partir de 2008, voire plutôt 2012)

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 952
    Points : 4 378
    Points
    4 378
    Par défaut
    Dans le modèle que vous présentez il n'y a rien pour faire le "ORDER BY", si vous aviez une clé unique :


    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
    with data as (    select 1 as rn,'François' as name,    'Bleu' as color,     21 as delta,     200 as total from dual
        union all
        select 2 as rn,'Pierre',    'Rouge',     18, null from dual
        union all
        select 3 as rn,'Jacques',    'Bleu',    11, null from dual    
        union all
        select 4 as rn,'Emilie',    'Bleu',    10, null from dual    
        union all
        select 5 as rn,'Richard',    'Rouge',    11, null from dual        
        union all
        select 6 as rn,'Christelle',    'Bleu',    21, null from dual
        union all
        select 7, 'Joan',    'Rouge',    19, null from dual
        union all
        select 8, 'Armelle',    'Bleu',    9, null from dual
        union all
        select 9, 'Stéphanie',    'Bleu',    24, null from dual
        union all
        select 10, 'Léa',    'Bleu',    4, null from dual
    )
    select name, color, delta, sumtotal - subtotal as result from (
        select rn, name, color, delta, total, 
            sum(total) over(partition by color order by rn) as sumtotal, 
            sum(delta) over(partition by color order by rn) as subtotal 
        from data 
        where color = 'Bleu'
     
     
    )
    ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    François	Bleu	21	179
    Jacques	Bleu	11	168
    Emilie	Bleu	10	158
    Christelle	Bleu	21	137
    Armelle	Bleu	9	128
    Stéphanie	Bleu	24	104
    Léa	Bleu	4	100

  4. #4
    Membre à l'essai
    Homme Profil pro
    Developpeur d'outils de pilotage
    Inscrit en
    Décembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Developpeur d'outils de pilotage

    Informations forums :
    Inscription : Décembre 2014
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Bonjour à vous,

    Merci de vos retours.

    aieeeuuuuu,

    Je n'ai jamais imaginé faire un case when dans une fonction d’agrégation comme somme. Je ne pensais même pas que c'était possible. Je vais essayer cette solution. Je vous tiens au courant si cette solution fonctionne.
    J'ai supposé que c'était une configuration de 2005, au vue de l'historique des données, mais c'est vrais que je n'ai pas vérifié la configuration exact des serveurs ou même du SGBD. (Je suis consultant chez mon client depuis seulement 2 mois, je n'ai pas encore eu besoin de cette information).

    JeitEmgie,

    Merci de votre retour, en effet je n'ai rien pour faire l'order by dans mon exemple. Mais ce n'est qu'un exemple simplifié, les données, que je traite, sont plus complexes. Par conséquent j'ai un couple de clé unique pour faire l'order by. Je ne voulais pas encombré ma demande de détails superflu.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Developpeur d'outils de pilotage
    Inscrit en
    Décembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Developpeur d'outils de pilotage

    Informations forums :
    Inscription : Décembre 2014
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Merci à vous en effet un case when dans la fonction d'agrégation fonctionne très bien !

    Merci encore et bonne journée !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par kenail Voir le message
    J'ai supposé que c'était une configuration de 2005, au vue de l'historique des données, mais c'est vrais que je n'ai pas vérifié la configuration exact des serveurs ou même du SGBD.

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

Discussions similaires

  1. [Google Sheets] Somme selon deux critères dont une date
    Par bbl09 dans le forum APIs Google
    Réponses: 3
    Dernier message: 12/04/2018, 14h17
  2. [DATA] Sommes des valeurs d'une variable selon une condition
    Par Totalex dans le forum SAS Base
    Réponses: 5
    Dernier message: 31/01/2017, 10h37
  3. Réponses: 5
    Dernier message: 14/10/2016, 10h08
  4. Calcul d'une somme cumulée selon plusieurs conditions
    Par Lorinlo dans le forum SAS Base
    Réponses: 0
    Dernier message: 02/12/2013, 11h16
  5. Faire une somme selon la condition
    Par GreatDeveloperOnizuka dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/12/2007, 11h29

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