Compter enregistrements dans un SELECT selon conditions

cs_thescientist59 Messages postés 3 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 30 décembre 2008 - 30 déc. 2008 à 11:10
EricSQL Messages postés 33 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 24 février 2011 - 21 janv. 2009 à 21:09
Bonjour à tous!


Je suis exposé à un problème et j'espère que vous pourrez m'aider!

D'avance, merci à ceux qui lisent ce message et y répondront!


Je fais une extraction de données à partir d'une BDD DB2, avec par exemple :


IDPERSONNE;IDFAMILLE;NOM;PRENOM;CATEGORIE


1;1;DUPONT;DAVID;PERE

2;1;DUPONT;MARIE;MERE

3;1;DUPONT;THOM;ENFANT

4;1;DUPONT;MARC;ENFANT

5;1;DUPONT;JEAN;ENFANT


6;2;DUPOND;JULIEN;PERE

7;2;DUPOND;LAURE;MERE

8;2;DUPOND;GERALD;ENFANT

9;2;DUPOND;FRED;ENFANT


Je voudrai attribuer un numéro pour les enfants de chaque famille, de la sorte :


1;1;DUPONT;DAVID;PERE

2;1;DUPONT;MARIE;MERE

3;1;DUPONT;THOM;ENFANT;1

4;1;DUPONT;MARC;ENFANT;2

5;1;DUPONT;JEAN;ENFANT;3


6;2;DUPOND;JULIEN;PERE

7;2;DUPOND;LAURE;MERE

8;2;DUPOND;GERALD;ENFANT;1

9;2;DUPOND;FRED;ENFANT;2


Vous l'aurez compris, je voudrai incrémenter de 1 chaque enfant d'une famille.

Pour le moment, j'arrive à retourner 1 pour chaque enfant.

Voici ma requête (pour les deux familles concernées) :


SELECT per.per_id, per.per_fam, per.per_nom, per.per_prm, prt.prt_cat,
sum(CASE prt.prt_cat when 'ENFANT' then '1' else '0' end) as test

FROM PER

JOIN PRT ON PRT.PER_NO = PRT.PER_ID

WHERE per.per_fam IN ('1','2')

GROUP BY per.per_id, per.per_fam, per.per_nom, per.per_prm

avec pour résultat :


ID;FAMILLE;NOM;PRENOM;CATEGORIE;TEST


1;1;DUPONT;DAVID;PERE;0

2;1;DUPONT;MARIE;MERE;0

3;1;DUPONT;THOM;ENFANT;1

4;1;DUPONT;MARC;ENFANT;1

5;1;DUPONT;JEAN;ENFANT;1


6;2;DUPOND;JULIEN;PERE;0

7;2;DUPOND;LAURE;MERE;0

8;2;DUPOND;GERALD;ENFANT;1

9;2;DUPOND;FRED;ENFANT;1


J'arrive à faire retourner la valeur 1 pour chaque enfant (avec le CASE) mais pas à l'incrémenter...

Je n'ai pas d'idée pour y parvenir, d'où mon post...!


Je vous remercie d'avance!

J'ai essayé beaucoup de fonctions, mais en vain!!


Stéphane
A voir également:

2 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
31 déc. 2008 à 21:36
Salut,

Je ne connais pas DB2, mais je vais tenter de repondre.

Ton probleme n'est pas fait pour etre repondu en SQL
car SQL est ensembliste et par definition non ordonné
donc impossible de dire que l'enfant 1 aura le numero 1

Il est peut etre possible de passer par un rank ou une histoire du genre
et encore la numerotation de sous ensemble, je ne vois pas trop comment le faire.

Sinon il y a en denrier recours la création de procédure stockée.

http://www.devx.com/getHelpOn/10MinuteSolution/16573/1954

Il y a peut etre la reponse dans ce lien.
Mais j'ai pas pris le temps d'analyser les requetes n'ayant pas DB2.

Bon sql
0
EricSQL Messages postés 33 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 24 février 2011
21 janv. 2009 à 21:09
Comme ceci peut être :
Select IdPersonne
, F.IdFamille
, Nom
, Prenom
, Categorie
, case Categorie when 'ENFANT' then IdPersonne - minID + 1 else NULL end
From FAMILLE F
left outer join ( Select IdFamille, min(IdPersonne) as minId
From FAMILLE
Where Categorie = 'ENFANT'
Group by IdFamille
) M
on F.IdFamille = M.IdFamille
Order by IdPersonne
;


/Eric
0
Rejoignez-nous