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

Sybase Discussion :

[ASE][12.5] Problème d'agrégat et soustraction


Sujet :

Sybase

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 25
    Par défaut [ASE][12.5] Problème d'agrégat et soustraction
    Bonjour,

    Voici mon problème :
    - j'ai une table contenant des n° de clients.
    - chaque client peut avoir de 0 à n filleul (mais un filleul ne peut avoir qu'un seul parrain)
    - chaque client, qu'il soit parrain ou filleul, dispose d'un certain nombre de points-cadeaux.
    - dans la table, le nombre de points-cadeaux d'un parrain comprend ses propres points, plus ceux de ses filleuls.

    But :
    Je cherche à récupérer, pour chaque client, le nombre de ses propres points-cadeaux.

    Avec une logique humaine, c'est assez simple : on regarde quels sont les filleuls d'un parrain, on additionne les points de ces filleuls, et on soustrait le tout aux points du parrain.
    Mais en Transac-SQL, c'est beaucoup plus chaud...
    Si quelqu'un entrevoit une solution, je suis prenneur

    Voici la structure de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE pointcadeau (
        id_client   int,
        id_parrain  int,
        nb_point    int
    )
    Pour les données, par exemple je peux avoir :
    - le client 1 a 1000 points, et deux filleuls (clients 3 et 4)
    - le client 2 a 400 points mais pas de filleul
    - le client 3 (filleul du 1) a 300 points, et a lui-même un filleul (client 5)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO pointcadeau VALUES ( 1, 1, 1000 )
    INSERT INTO pointcadeau VALUES ( 2, 2,  400 )
    INSERT INTO pointcadeau VALUES ( 3, 1,  300 )
    INSERT INTO pointcadeau VALUES ( 4, 1,  100 )
    INSERT INTO pointcadeau VALUES ( 5, 3,   50 )
    Pour l'instant, un SELECT de ma table me donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    id_client id_parrain nb_point
    --------- ---------- --------
            1          1     1000
            2          2      400
            3          1      300
            4          1      100
            5          3       50
    Le résultat final que je voudrais obtenir est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    id_client nb_point_reel
    --------- -------------
            1           600
            2           400
            3           250
            4           100
            5            50

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 228
    Billets dans le blog
    25
    Par défaut
    qqch comme ça ?

    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
    select id_client, max(nb_point) m
    from pointcadeau
    into #max
    group by id_client
     
    select p.id_client, sum(p.nb_point) s
    from pointcadeau p, #max m
    into #min
    where p.id_client=m.id_client
    and p.nb_point < m.nb_point
    group by id_client
     
     
    select a.id_client, m-coalesce(s,0)
    from #min i, #max a
    where i.id_client=a.id_client
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 25
    Par défaut
    Je n'ai pas réussi à faire fonctionner votre solution

    Je me suis orienté vers une solution à base de CASE.
    Reste à voir si elle fonctionne pour des volumes de production et pas simplement dans l'exemple que j'ai donné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT   id_parrain AS 'id_client', 
             SUM( CASE WHEN id_client = id_parrain THEN nb_point ELSE - nb_point END ) AS 'nb_point'
    INTO     #cumul
    FROM     pointcadeau 
    GROUP BY id_parrain
     
    SELECT   pc.id_client, 
             ISNULL(CASE WHEN c.nb_point < 0 THEN pc.nb_point + c.nb_point ELSE c.nb_point END, pc.nb_point) 
    FROM     pointcadeau pc
    LEFT OUTER JOIN #cumul c 
    ON       pc.id_client = c.id_client

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

Discussions similaires

  1. [ASE 12.5] problème de performances
    Par bossun dans le forum Adaptive Server Enterprise
    Réponses: 9
    Dernier message: 29/04/2008, 19h24
  2. [ASE 12.5] problème d'espace disponible dans le journal
    Par manaboko dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 22/11/2007, 12h10
  3. [ASE 11.9] Problème d'agregats
    Par NicaeaCivitas dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 29/08/2007, 14h56
  4. Réponses: 2
    Dernier message: 22/01/2006, 02h11
  5. problème d'agrégation!
    Par cepex dans le forum Access
    Réponses: 3
    Dernier message: 13/01/2006, 01h33

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