Sortir les noms qui reviennent plus d'une fois dans un mois

Résolu
Streptococcus Messages postés 25 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 18 juillet 2007 - 6 juil. 2007 à 10:45
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 - 9 juil. 2007 à 19:35
Bonjour,
 j'ai une table de ma bdd qui contient des ordonnances. Chaque ordonnance contient une date d'emmission, un nom de patient, et aussi un identifiant propre à l'ordonnance.
 Je cherche à faire une requête SQL permettant de sortir le nom des patients qui ont été sujets à plus d'une ordonnance en moins d'un mois...
 et je ne trouve pas trop comment faire, mon problème est plus algorithmique et linguistique...

pour l'instant avec cette requête :

SELECT

id_patient
,
date
FROM antibiotherapie

WHERE id_patient
IN
(SELECT id_patient

FROM antibiotherapie

GROUP
BY id_patient

HAVING
COUNT(*)
> 1
)

j'arrive à obtenir l'identifiant des patients qui ont été sujets à plus d'une ordonnance avec en face la date correspondant à l'ordonnance propre à ce patient... càd

120    2007-06-19 00:00:00
121    2007-06-18 00:00:00
120    2007-06-20 00:00:00
130    2007-06-28 00:00:00
120    2007-07-05 00:00:00
121    2007-07-05 00:00:00
130    2007-07-05 00:00:00

 Je voudrais obtenir un truc du genre, l'identifiant du patient avec derrière le nombre d'ordonnance qu'il a eut avec moins d'un mois d'intervalle...je sais que l'on peut utiliser la fonction SQL DATEDIFF("d", date1, date2), pour obtenir le nombre de jours entre deux dates, mais comment récuperer ces dates au sein de la requête, et comment faire s'il y en a plus de deux ?
Quelqu'un de très fort en SQL et/ou en algo peut-il m'aiguiller sur une piste ?
merci d'avance
Quentin

8 réponses

Streptococcus Messages postés 25 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 18 juillet 2007
9 juil. 2007 à 14:45
Re-bonjour,
Voici la solution à laquelle j'arrive, j'ai utilisé un self-join...et ma foi ça à l'air de fonctionner...

SELECT

DISTINCT Table1
.id_patient

FROM

(SELECT id_patient
,
date
FROM antibiotherapie

WHERE id_patient
IN
(SELECT id_patient

FROM antibiotherapie

GROUP
BY id_patient

HAVING
COUNT(*)> 1
)
) Table1
,
(SELECT id_patient
,
date
FROM antibiotherapie

WHERE id_patient
IN
(SELECT id_patient

FROM antibiotherapie

GROUP
BY id_patient

HAVING
COUNT(*)> 1
)
) Table2

WHERE Table1
.id_patient
= Table2
.id_patient

AND Table1
.date
<> Table2
.date
AND
DATEDIFF(dd
,
convert(datetime, Table1
.date),
convert(datetime, Table2
.date))
> 0

AND
DATEDIFF(dd
,
convert(datetime, Table1
.date),
convert(datetime, Table2
.date))
<= 30
3
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
6 juil. 2007 à 15:05
Bonjour,

essaies ceci :

SELECT antibiotherapie.IdPatient, Count(antibiotherapie.IdPatient) AS CompteDeIdPatient, antibiotherapie.Dat
FROM antibiotherapie
GROUP BY antibiotherapie.IdPatient, antibiotherapie.Dat
HAVING (((Count([antibiotherapie]![IdPatient]))>1) AND ((DateDiff("\d",Date(),[antibiotherapie]![Dat]))<30));

Remarque : tu dois rennomer ton champ date pour qu'il n' y ait pas de confusion.
(Dat au lieu de date par exemple)

 
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
6 juil. 2007 à 16:16
non, ça marche pas.
j' ai refais la requête autrement et u' ai testé et il y' a effectivement un problème au niveau
de l' interval.
Le fait est dans une requête on ne pas faire d' opération entre la valeur d' un champ et
se valeur juste avant celle-ci.
On peut tout au plus avoir la dernière ou la première.
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
6 juil. 2007 à 18:16
Bon,
je ne sais pas si ça serait possible pour toi d' ajouter à ta table
un champ qui renseigne sur la date de la précédente ordonnance et qui sera alimenté
au moment d' ajouter un enregistrement.
Je m' explique avec ton exemple:
IdOrdo IdPatient dat               prec_dat
1 120 19/06/2007 19/06/2007
2 121 18/06/2007 18/06/2007
3 120 20/06/2007 19/06/2007
4 130 28/06/2007 28/06/2007
5 120 05/07/2007 20/06/2007
6 121 05/07/2007 18/06/2007
7 130 05/07/2007 28/06/2007


il est clair que pour la première ordonnance dat = prec_dat
Pour la deuxième prec_dat =dat de la précédente.
De là j' ai réussi à avoir une requête qui me renvoie


IdOrdo IdPatient dat prec_dat Diff
3 120 20/06/2007 19/06/2007 1
5 120 05/07/2007 20/06/2007 15
6 121 05/07/2007 18/06/2007 17
7 130 05/07/2007 28/06/2007 7


et dont l' expression est :
SELECT antibiotherapie.IdOrdo, antibiotherapie.IdPatient, antibiotherapie.dat,


antibiotherapie.prec_dat, (DateDiff("d",[antibiotherapie]![prec_dat],[antibiotherapie]![dat]))


AS Diff
FROM antibiotherapie
WHERE ((((DateDiff("d",[antibiotherapie]![prec_dat],[antibiotherapie]![dat])))>0 And


((DateDiff("d",[antibiotherapie]![prec_dat],[antibiotherapie]![dat])))<30));


On exclut donc
> Diff=0 (dat=prec_dat => une seule ordonnance)
> Diff>30 =>plus d' un mois


Par la suite et à partir de requête1, tu peux faire une autre requête regroupement
qui te renvoie le nommbre de fois ou un patient a eu plus d' une ordo en moins
d' un mois..


A toi de voir...


 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Streptococcus Messages postés 25 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 18 juillet 2007
9 juil. 2007 à 12:12
Bonjour Chaibat,
merci de ta réponse...
la solution que tu propose me parrait interressante, mais je ne pourrais pas la mettre en oeuvre car il est trop tard pou modifier mes tables, trop de code repose déja dessus et je n'aurais pas le temps de tout revoir...donc je vais continuer à checher...merci de ton aide, et si tu as une autre idée, je suis toujours preneur
Quentin
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
9 juil. 2007 à 16:24
Bonjour Quentin,
ravi que tu ais pu trouver ce qui te convient le mieux.
Si tu pouvais poster un tableau récapitulatif du résultat
renvoyé par ta requête, ça serait bien...
Pour ma part, si j' étais dans l' impossibilité de modifier la
structure de mes tables, il me resterais toujours la possibilité
de passer à la vieille bonne méthode, à savoir: un traitement par code.
Si le coeur t' en dis , on pourrait en discuter.


A+











 
0
Streptococcus Messages postés 25 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 18 juillet 2007
9 juil. 2007 à 17:09
id_patient
120
121
130

Tout simplement...
en fait j'ai trouvé la solution en bidouillant dans l'éditeur de requête de SQL Serveur...j'ai commencé par faire un
SELECT * du self join (produit cartésien d'une table sur elle-même) de ma table qui elle même est une sous-sous-requête....après en voyant ce qui tombe je corrige ce qui va ou ne va pas, j'ai aussi mis du temps à comprendre la bonne syntaxe pour la fonction DATEDIFF...il faut penser à convertir date en format date_time...va savoir pourquoi, ma date étais en format smalldatetime, ce qui me semble sensiblement similaire mais bon...

 Effectivement, tout problème de requête SQL peux plus ou moins se résoudre par code, mais d'une part, réalisant ce programme dans le cadre d'un stage, j'ai pour objectif de produire un code le plus clair et concis possible pour permettre au responsable informatique de ma boite de comprendre mon code afin d'opérer des modification éventuelle...D'autre part, mais je ne suis pas sûr et certain de ça, à vérifier, je pense que tout ce que l'on peut faire en SQL plutôt qu'en code, c'est du temps gagné pour le prog, car un temps de calclul moins long...
 voilà voilà, merci de ton soutient en tout cas
Quentin
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
9 juil. 2007 à 19:35
J' incite pas !
Bien que je ne soit pas convaincu par tes arguments pour ne pas faire autrment.
Merci en tout cas d' avoir donné suite.
Ravi de t' avoir connu.
Bonne continuation...


Chaibat
0
Rejoignez-nous