Plop,

Je ne sais pas si l'intitulé est exact, mais voilà ce qui m'a été demandé de faire, et j'aimerais savoir s'il est possible de faire ça en pur SQL avec sqlite.

On nous a donné trois tables de base , dont voici quelques lignes :
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
 
Calendrier		
	Cal_id	Dt
	1	9/11/2012
	2	9/18/2012
	3	9/25/2012
Patient		
	Id	Nom
	1	Elizabeth Lincoln
	2	Diego Roel
	3	Mario Pontes
Rv		
	Patient	Rv
	Diego Roel	9/11/2012
	Mario Pontes	9/11/2012
	Bernardo Batista	9/11/2012
Voici les requêtes de création de ces tables :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
CREATE TABLE Calendrier(
Cal_id integer not null,
Dt date not null,
primary key (Cal_id));
CREATE TABLE Patient(
Id integer not null,
Nom text not null,
primary key (Id));
CREATE TABLE Rv(
Patient text not null,
Rv date not null);
À partir de ces trois tables, il nous a été demandé de construire cette table :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
Rq Rv Tb															
	Patient	#Prs	12/11	12/04	11/27	11/20	11/13	11/06	10/23	10/19	10/16	10/09	09/25	09/18	09/11
	Alejandra Camino	1	.	.	.	.	.	.	.	.	.	.	.	.	!
	Alexander Feuer	0	.	.	.	.	.	.	.	.	.	.	.	.	.
	Ana Trujillo	4	.	.	.	.	.	!	!	.	!	!	.	.	.
Donc, une table qui reprend chaque patient, le total de ces rdv, puis pour chaque date de rdv de la table Calendrier indique s'il a été présent ou pas.
Pour les deux premiers champs (Nom du patient et total de ses rdv), j'ai fait cette requête :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
select Patient, count(Rv) from Patient P, Rv R where P.Nom = R.Patient group by Patient
union 
select Nom, "0" from Patient P where not exists(select * from Rv where Patient = P.Nom);
Récupérer l'ensemble des dates auxquelles un patient a été ne pose pas de soucis, mais insérer chacune de ces valeurs dans une seule ligne, si.
Du coup, je me suis fait un petit script python :
Code python : 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
 
requete = """
select Patient, count(Rv) from Patient P, Rv R where P.Nom = R.Patient group by Patient
union 
select Nom, "O" from Patient P where not exists(select * from Rv where Patient = P.Nom);
"""
# select est une fonction définie ailleurs dans le script retournant une liste des résultats de la requête.
liste = select(db, requete)
 
rdv = select(db, "select Dt from Calendrier;")
for date in rdv :
    print date[0], " ",
print ""
for el in liste:
    print el[0], "\t\t", el[1], "\t",
    for date in rdv:
        present = select(db, "select * from Rv where Patient = \"" + el[0] + "\" and Rv = \"" + date[0] + "\"")
        if(len(present) > 0):
            print ".",
        else:
            print "!",
    print ""
Mais j'aimerais tout de même savoir s'il est possible de faire ce qui était demandé sans recourir à une quelconque API, le tout uniquement dans sqlite, juste en utilisant les fonctions sqlite et des requêtes sql.