Précédent   Forum des professionnels en informatique > Bases de données > Sybase
Sybase Forum sur la base de données Sybase. Avant de poster -> F.A.Q Sybase, Tutoriels Sybase
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/05/2006, 13h56   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 17
Points : 10
Points : 10
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 :
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 :
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 :
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 :
1
2
3
4
5
6
7
8
id_client nb_point_reel
--------- -------------
        1           600
        2           400
        3           250
        4           100
        5            50
Semhur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2006, 22h00   #2
Rédacteur/Modérateur
 
Avatar de fadace
 
Homme Fabien Celaia
Administrateur de base de données
Inscription : octobre 2002
Messages : 3 779
Détails du profil
Informations personnelles :
Nom : Homme Fabien Celaia
Âge : 41
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2002
Messages : 3 779
Points : 8 124
Points : 8 124
Envoyer un message via ICQ à fadace Envoyer un message via Skype™ à fadace
qqch comme ça ?

Code :
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 / Sybase / MS-SQL / DB2 / Informix / Postgresql
Administrateur SAP
Mes articles

Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !
fadace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2006, 15h55   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 17
Points : 10
Points : 10
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 :
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
Semhur est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h21.


 
 
 
 
Partenaires

Hébergement Web