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 :

cumul progressif par client


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 16
    Points : 14
    Points
    14
    Par défaut cumul progressif par client
    Bonjour J'ai besoin d'avoir en sql le nom, prénom et cumul de QTE produits par client et je ne veux afficher que les lignes tel que le cumul dépasse une certaine valeur exemple.

    table initiale c dans le fichier table


    Résultat si cumul>=200 est dans le ficher résultat




    Je vous remercie d'avance
    Images attachées Images attachées   

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonjour,
    Je ne suis pas sur d'avoir tout bien compris mais je vais essayer.

    Alors si le cumul et bien l'addition de tes qts.

    Tu peux faire une requete de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select les_champs_que_tu_desire, SUM(qt) as cumul from ta_table where cumul > 199

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Enfaîte, si c'est dans le même genre que t'on image résultat ce que tu désire c'est un peu plus compliqué, le plus simple et un requête avec toutes tes tuples et faire un traitement via un autre langage.

    Sinon vas voir du coter des requêtes multiples avec des if et tout, mais je ne pense pas que ça soit la meilleur solution autant en terme de maintenance qui voudra reprendre la requête et en mise en place tu vas perdre plus de temps

  4. #4
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    En fait vous voulez:


    Le max avec la date correspondante puis le cumul global + date min et date max?

  5. #5
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Je ne comprends pas exactement le résultat escompté.

    SELECT les_champs_que_tu_desire, SUM(qt) AS cumul FROM ta_table WHERE cumul > 199
    ??? ce n'est pas du SQL ca!

    La syntaxe pour filtrer l'agregat(SUM) est HAVING de la sorte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT colonne1,colonne2, SUM(qt) AS cumul
     FROM ta_table 
    GROUP BY colonne1,colonne2 
    HAVING SUM(qt)>199

  6. #6
    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 : 43
    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
    De toute façon la requête n'aurait pas été compilée puisque la syntaxe est fausse.
    En effet, on ne peut pas spécifier une clause WHERE sur un alias de colonne, sauf si cet alias provient :

    - d'une expression de table commune
    - d'une sous-requête.

    En revanche on peut le faire dans l'ORDER BY.
    Cela est dû au fait que le plan de requête est construit à partir de la requête dans cet ordre :

    - Traitement de la clause FROM / JOIN / APPLY
    - Traitement des clauses WHERE/AND éventuelles
    - Calcul de groupes si la clause GROUP BY existe
    - Filtrage des groupes si la clause HAVING existe
    - Ajout des colonnes et expressions du SELECT
    - Tri suivant l'éventuelle clause ORDER BY.

    @++

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Ce qui m'embête surtout c'est que votre résultat attendu ne correspond pas à vos données initiales, c'est un grand manque de rigueur.

    Donc, avec un autre jeu de données je suppose que ce que vous voulez obtenir est la requête suivante :
    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 MaTable (id_client, quantite, date_achat) as
    (
    select 1,  23, '1983-09-14' union all
    select 1,  22, '1995-01-12' union all
    select 1,  21, '2002-06-06' union all
    select 1, 145, '2004-06-11' union all
    select 1,  23, '2011-08-11' union all
    select 2,  25, '1983-09-10' union all
    select 2,  22, '1995-01-12' union all
    select 2,  21, '1997-01-12' union all
    select 2, 145, '2002-06-06' union all
    select 2,  23, '2011-08-11'
    )
      select t1.id_client, t1.quantite, t1.date_achat
           , sum(t2.quantite) as cumul
           , min(t2.date_achat) as date_min_date_achat
           , min(t1.date_achat) over(partition by t1.id_client, sign(sum(t2.quantite)-200)) as premiere_date
        from MaTable as t1
             inner join MaTable as t2
               on t2.id_client   = t1.id_client
              and t2.date_achat <= t1.date_achat
    group by t1.id_client, t1.quantite, t1.date_achat
      having sum(t2.quantite) >= 200
    order by t1.id_client asc, t1.date_achat asc
     
     
    id_client   quantite    date_achat cumul       date_min_date_achat premiere_date
    ----------- ----------- ---------- ----------- ------------------- -------------
    1           145         2004-06-11 211         1983-09-14          2004-06-11
    1           23          2011-08-11 234         1983-09-14          2004-06-11
    2           145         2002-06-06 213         1983-09-10          2002-06-06
    2           23          2011-08-11 236         1983-09-10          2002-06-06

    Citation Envoyé par jouana Voir le message
    Enfaîte, si c'est dans le même genre que t'on image résultat ce que tu désire c'est un peu plus compliqué, le plus simple et un requête avec toutes tes tuples et faire un traitement via un autre langage.

    Sinon vas voir du coter des requêtes multiples avec des if et tout, mais je ne pense pas que ça soit la meilleur solution autant en terme de maintenance qui voudra reprendre la requête et en mise en place tu vas perdre plus de temps
    Une mauvaise requête suivi d'un très mauvais conseil => -2 !

Discussions similaires

  1. comment faire un cumul progressif par mois en sql
    Par cana13 dans le forum Développement
    Réponses: 13
    Dernier message: 03/02/2011, 10h39
  2. Cumul quantité par client
    Par bok2000 dans le forum Access
    Réponses: 5
    Dernier message: 20/06/2006, 16h07
  3. [MySQL] requete avec cumul mois par mois
    Par michaelbob dans le forum Langage SQL
    Réponses: 5
    Dernier message: 16/01/2006, 16h32
  4. Réponses: 1
    Dernier message: 15/11/2005, 16h01
  5. Cumul progressif
    Par lper dans le forum Langage SQL
    Réponses: 14
    Dernier message: 17/08/2005, 11h41

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