Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parDamien Laviolette Modifié depuis plus de 7 années
1
Comment intérroger GEEDOC à partir de SaS ?
Alain Gaillard MC Batut (Juillet 2011) GEEDOC : Gestion des Elevages Expérimentaux Ovins/caprins
2
C’est de la consultation !!!
Plan : La structure de la base Geedoc : MCD Pré-requis pour accéder à la base de données Le langage d’interrogation : SQL SQL de base sur une table SQL : jointures Quelques exemples liés à Geedoc Méthode d’Hélène Conclusions C’est de la consultation !!!
3
Unités Expérimentales concernées
GA : Langlade (Ovin viande) : Mathias Aletru-Julien Ruesche Lafage (Ovin viande) : Fabien Carrière-Dominique François Lafage (Ovin lait) : David Portes –Charlotte Allain Bourges-Galle (Caprin lait) : Thierry Fassier-Christophe Huau Bourges-LaSapinière (Ovin viande) : Didier Marcon–Dominique F. Gardel (Ovin/Caprin viande) : Rémy Arquet Duclos (Ovin/Caprin viande) : Caroline Anaïs Mario Giorgi PHASE : Les Verrines (Caprin lait) : Hugues Caillat Mejusseaume (Caprin lait) : Gaëlle Mandrille UEPAO Tours-Nouzilly (Ovins Viande) : Didier Bubreuil-Céline Maton LeMerle (Ovin Viande) : abandonné UERT-Intrabois (Ovin viande) : Lionel Laval UEMA-Orcival (Ovin viande) : Grignon (Caprin lait) : Joseph Tessier
4
Saisies portables sur le terrain
Organisation du Système d’Information (SI) Pesée sur Baléa Teo Mise Bas Sidex Idlogger (Note d’état, IA, Lutte Naturelle, .etc.) Contrôle laitier Saisies portables sur le terrain Unité de Recherche Unité Expérimentale Extraction des données Valorisation des données SaS (personnes avertis) JOUY EN JOSAS CTIG Sauvegardes Oracle 10g
5
1- MCD : Modèle Conceptuel des Données
Autour de l’animal Mesures diverses Liées à la reproduction Liées aux saillies Liées aux mises bas Autour du lait Carnet Sanitaire : voir sur le MCD CaSaME Langage lié aux bases de données : Table de données = fichier structuré Enregistrement = une ligne de données Champ = une colonne Jointure = lien entre les tables Clé primaire = unicité de l’enregistrement Clé étrangère = permet la cohérence des données
6
1.1 Autour de l’Animal Bleu = clé primaire Animal espece elv_ne
id_animal d_nais sexe typ_gen lignee IPG pg_elv pg_id_animal pg_campagne pg_saison mg_elv mg_id_animal mg_campagne mg_saison ma_elv ma_id_animal Present elv_prod prod espece elv_ne id_animal d_arrivee d_sortie elv_envoi Typ_gen espece typ_gen race libelle duree_gest Race espece race nom_race Genotypes espece elv_ne id_animal genotype allele1 allele2 Elevage Elv nom_domaine Bleu = clé primaire
7
1.2 Mesures diverses Animal espece elv_ne id_animal d_nais sexe
typ_gen ipg Present elv_prod prod espece elv_ne id_animal d_arrivee d_sortie Pesee elv_prod prod espece elv_ne id_animal d_pesee h_pesee nat_pesee cd_pesee lot_pesee poids Endoscopie elv_prod prod espece elv_ne id_animal d_endoscopie campagne saison Abattage elv_prod prod espece elv_ne id_animal d_abattage pds_carcasse larg_carcasse Etat_Corporel elv_prod prod espece elv_ne id_animal d_note_etat note_lom note_stern cd_etat
8
1.3 Autour de la reproduction
elv_prod prod espece elv_ne id_animal campagne saison deb_saison sexe* lot_lutte Present elv_prod prod espece elv_ne id_animal Scycle elv_prod prod espece elv_ne id_animal campagne saison cd_produit d_pose h_pose dose d_retrait h_retrait Observ Gestation elv_prod prod espece elv_ne id_animal campagne saison d_diagnostic methode b_resultat nb_foetus nb_viables rang Hormonal elv_prod prod espece elv_ne id_animal campagne saison cd_produit d_hormonal h_hormonal mod_inj dose_inj lot_fabric operateur Campagne elv_prod prod espece campagne saison libelle Lot_Lutte elv_prod prod espece campagne saison lot_lutte d_debut commentaire
9
1.4 Autour des saillies Saillie elv_prod prod espece elv_ne id_animal
campagne saison d_saillie h_saillie mod_saillie utilise Lutte_Nat elv_prod prod espece elv_ne id_animal campagne saison d_saillie h_saillie typ_lutte d_marque d_fin_lutte pg_elv pg_id_animal pg_campagne pg_saison pg_typ_gen Repro elv_prod prod espece elv_ne id_animal campagne saison IA elv_prod prod espece elv_ne id_animal campagne saison d_saillie h_saillie typ_seme pg_elv pg_id_animal pg_campagne pg_saison d_prelev Psperme elv_prod prod espece elv_ne id_animal d_prelev motilite Emb_Impl elv_prod prod espece elv_ne id_animal d_saillie h_saillie
10
1.5 Autour des mises bas Prevision_MB elv_prod prod espece elv_ne
id_animal campagne saison elv_origine cpo sno d_prevu_mb Misebas elv_prod prod espece elv_ne id_animal campagne saison d_misebas portee groupe no_lact comment_mb Repro elv_prod prod espece elv_ne id_animal campagne saison Cas particulier saillies faites dans une UE et mises bas faites dans une autre UE elv_prod=elv_origine ET campagne=cpo ET saison=sno
11
1.6 Autour du lait Mise_Traite elv_prod prod espece elv_ne id_animal
campagne saison d_debut_traite d_fin_traite cse_fin Misebas elv_prod prod espece elv_ne id_animal campagne saison d_misebas no_lact Traite_Anim elv_prod prod espece elv_ne id_animal d_traite moment campagne lot_traite place qte_lait no_ech tb tp uree Chantier_Tr elv_prod espece d_traite moment campagne lot_traite h_debut h_fin qte_lait ctl_offi ctl_expe ctl_qual no_clo Debit elv_prod espece elv_ne id_animal d_traite moment no_mesure mesure Palpation Pmm_Anim
12
1.7 Rappel des identifiants :
Identité complète : elv_ne (8) + id_animal (6) + espece (caprins 5 + 5) IPG : (11c) on a enlevé les codes France et Espèce Boucle INRA intra élevage (6) : supprimée (ancienne boucle Nedap) Numéro de travail (6) pour les animaux en reproduction Boucle visuelle IPG 11c = N° INSEE (6) + Millésime (1) + numéro (4) (obligatoire depuis 2006) RFID 15c = Pays(250) + espèce (0) + IPG 11c (Pays=199 pour nés avant 2006) Vous n’avez pas besoin d’utiliser : - le champ RFID dans la table ANIMAL - le champ boucle (colonne Nedap) dans la table PRESENT - le champ n_travail de la table REPRO
13
1.8 Vie d’un animal
14
2- Prérequis pour se connecter à la base
Accéder à Oracle depuis dga20 : modifier le fichier .profile #ajouter lignes pour accéder à Oracle à partir de SaS export ORACLE_HOME=/ora10g/home export SASORA=V7 Avoir les droits d’utiliser Connect/Sql : T. Coudert Vérifier la connexion : à tester Savoir ce que l’on veut faire Jouer le jeu : n’extraire que ses données, c’est à dire : Ovins :‘Duclos-Viande’,’Gardel-Viande’ Caprins : ‘Duclos-Viande’,’Gardel-Viande’ Lancement des scripts SaS : soit en direct dans les fenêtres Sas soit en commande : Sas nom_script
15
2.1 Mon fichier .sas en général
proc sql; connect to oracle (user=login_geedoc password=password_geedoc create table tableau_sas as select col1,col2,col3,col4 from connection to oracle (select col1,col2,col3,col4 from geedoc.table where .etc. ); disconnect from oracle; Le nb de colonnes de la table SaS = nb de colonnes de la requête SQL Le type des colonnes de la table Sas = typage des colonnes de la table Oracle sauf si on change le type de données par une fonction (to_char,to_number, .etc.) Exemple : to_char(d_nais,’DD/MM/YYYY’) « 12/10/2012 »
16
2.1 Mon fichier SaS sous dga12 (exemple)
proc sql; connect to oracle (user=ARR password=… create table tab_anim as select elv_ne,id_animal,campagne,saison,lot_lutte from connection to oracle (select elv_ne,id_animal,campagne,saison,lot_lutte from geedoc.repro where elv_prod=‘ ’ and espece=‘2’ and campagne=‘2014’ and saison=‘2’ And sexe=‘2’ and lot_lutte=’01’ order by id_animal,elv_ne); disconnect from oracle; quit; ARR : utilisateur oracle (droit de lecture) dga5 : machine unix où est la base de données E : alias de la base GEEDOC tab_anim : table SaS
17
ORACLE SQL/SaS Initial Fonction utile Sortie Entrée Number(w) w. Number(w,d) w.d Char(w) $w. Varchar(w) input(colonne,w.) Date date datetime16. datepart(nom_var) substr(col,1,9) Char(9) $9. input(nom_var,date9.) le format SAS datetime correspond en numérique au nombre de secondes depuis le 01/01/1960 le format SAS date correspond en numérique au nombre de jours depuis le 01/01/1960. Date=mdy(mois,jour,année) : d1=mdy(12,02,03) fournit date du 02 décembre 2003
18
Exemple pour traitement des dates
proc sql; connect to oracle (user=ARR password=??? create table pesee as select anim,input(d_pesee,date9.) as d_pesee,poids,lot_pesee,cd_pesee from connection to oracle ( select elv_ne||id_animal as anim, substr(d_pesee,1,9) as d_pesee,poids,lot_pesee,cd_pesee from geedoc.PESEE where elv_prod=‘ ' and prod=‘2' and espece=‘2' and d_pesee between ‘01-JUL-2014' and ‘31-JUL-2014’ order by id_animal,d_pesee); disconnect from oracle; quit; proc sort data=pesee;by anim;
19
3- SQL : Structured Query Langage (Langage de requête structuré)
SELECT * | { [distinct] colonne | expression [as alias] , … } FROM table1 [AS alias] { [LEFT|RIGHT] [INNER|OUTER ] JOIN table2 [ON table2.col2=table1.col1] …} WHERE condition GROUP BY col1 [,col2, …] HAVING filtre ORDER BY {col1 [ASC|DESC] [, col2 …]} SELECT et FROM sont obligatoires (et pour SaS WHERE) les autres options entre crochets [ ] sont facultatives nom de table : geedoc.nomtable déconseillé à partir de SaS : select * from table
20
3.1 SQL de base sur une table
Repro elv_prod prod espece elv_ne id_animal campagne saison deb_saison lot_lutte sexe groupe FROM geedoc.Repro WHERE elv_prod=‘ ’ and prod=‘2’ and espece=‘2’ Elv_prod : : Gardel : Duclos Espece : 1 =Caprins, 2 =Ovins Prod : 1 =Lait, 2 =Viande
21
3.1.1 Select les colonnes sur UNE seule table
Sélection de colonnes particulières, les colonnes sont séparées par une virgule : SELECT elv_ne,id_animal,campagne,saison,lot_lutte FROM geedoc.Repro As sert à donner un nouveau nom : SELECT id_animal as id, lot_lutte as lot FROM geedoc.Repro Concaténer : SELECT elv_ne,id_animal, allele1||’/’||allele2 as allele FROM geedoc.Genotypes Ajout de colonnes descriptives : SELECT elv_ne,id_animal, h_pesee, h_pesee, poids, ’en g’ FROM geedoc.Pesee Utilisation de fonctions : SELECT count(*) FROM geedoc.Repro Sélection de valeurs différentes uniquement : SELECT distinct lot_lutte,sexe FROM geedoc.Repro
22
3.1.2 WHERE condition : opérateurs
col=valeur col != valeur col>valeur col<valeur col>=valeur col<=valeur col is null col is not null col between valeur1 and valeur2 col in (valeur1,valeur2,.etc.) col not in (valeur1,valeur2,.etc.) Opérateurs logiques : and , or , not Mettre des parenthèses pour le ou (or) Opérateurs arithmétiques : + - * / Ces opérateurs ne s’appliquent que sur les colonnes de type numérique
23
3.1.3 Exemples : requête sur une seule table
SELECT elv_ne,id_animal,campagne,saison,sexe,lot_lutte FROM geedoc.Repro WHERE elv_prod=‘ ’ and prod=‘2’ and espece=‘2’ and campagne = ‘2013’ and saison between ‘1’ and ‘3’ and lot_lutte in (’07’,’09’) and substr(id_animal,1,2)!=‘13’ SELECT elv_ne,id_animal,d_pesee,h_pesee,poids*10 0 as pds_g FROM geedoc.Pesee WHERE elv_prod=‘ ’ and prod=‘2’ and espece=‘2’ and lot_pesee not in (’07’,’09’) and d_pesee between ’01-APR-2013’ and ’10-OCT-2013’ and cd_pesee in (’02’,’03’,’04’) and poids > 200
24
3.1.4 Traitement sur les chaînes de caractères
Concaténation : allele1||’-’||allele2 as Allele : ARR ARQ ARR -ARQ trim(allele1)||’-’||trim(allele2) as allele ARR-ARQ substr(id_animal,1,2)=‘13’ (millésime) campagne like ’13%’ commençant par 13 libelle like ‘%R%’ contenant la chaîne R lower(lignee) minuscule upper(lignee) majuscule initcap(lignee) lettre capitale rpad(lignee,6,’!’) ajoute le caractère ! à droite pour compléter à 6 lpad(lignee,6,’-’) ajoute le caractère - à gauche pour compléter à 6 trim(lignee) enlève les blancs à droite et à gauche substr(upper(lignee),1,6) upper(lignee) like ‘CCS%’ replace(‘jack and jue’,’j’,’bl’) black and blue
25
3.1.5 Traitements sur les dates
SELECT elv_ne,id_animal,d_pesee,poids FROM geedoc.pesee WHERE elv_prod=‘ ’ and prod=‘2’ and espece=‘2’ and d_pesee between ’01-APR-2013’ and ’30-DEC-2013’ and d_pesee=to_date(’01/06/2013’,’DD/MM/YYYY’) Préconisé and d_pesee between ’01-JUN-2013’ and to_date(’01/06/13’,’DD/MM/RR’)+30
26
3.1.5 Traitement sur les dates - suite
to_char(d_pesee, ’DD/MM/YYYY’) 08/10/2016 to_char(d_pesee, ’DD’) number(to_char(d_pesee,’dd’)) 8 to_char(d_pesee, ’MM’) 10 to_char(d_pesee,’MON’) OCT to_char(d_pesee,’mon’) oct to_char(d_pesee, ’YYYY’) to_char(d_pesee, ’rr’) 16 to_char(h_fin_traite,’HH12:MI’) 06H35 to_char(h_fin_traite,’HH24:MI’) 18H35 select extract ({year | month | day | hour | minute | second} from col_date) select sysdate - d_nais as age (sysdate = date courante) select sysdate, last_day(sysdate), last_day(sysdate)-sysdate from dual; 02-DEC DEC months_between(d1,d2) nombre de mois entre d1 et d2 add_months(d,n) ajoute n mois à la date d
27
3.1.6 Fonctions mathématiques :
Abs(n) : valeur absolue de n Mod(n,m) : modulo de n par m (reste de la division entière de n par m) Round(n,m) : arrondi de n à m chiffres Sqrt(n) : racine carrée de n Trunc(n,m) : tronque n à m chiffres Acos(n) : angle de cosinus de n Asin(n) : angle de sinus de n Atan(n) : angle de tangente de n Cos(n) : cosinus de n Exp(n) : exponentielle (e à la puissance n) Ln(n) : logarithme népérien de n Log(n) : logarithme décimal de n Sin(n) : sinus de n Tan(n) : tangente de n
28
3.1.7 Order by : tri des données du résultat
Order by col asc/desc : (asc par défaut) SELECT elv_ne,id_animal, d_pesee,poids FROM geedoc. Pesee WHERE elv_prod=‘ ’ and prod=‘2’ and espece=‘2’ and id_animal between ‘120001’ and ‘139999’ and d_pesee=’22-MAR-2013’ and ’01-OCT-2013’ and nat_pesee=‘2’ and cd_pesee=‘02’ ORDER BY id_animal, poids desc
29
3.1.8 Group by : définition d’un groupe
Pour avoir le nombre d’animaux pesés par date de pesée et par code de pesée : SELECT distinct d_pesee, cd_pesee, count(*) FROM geedoc.Pesee WHERE elv_prod=‘ ’ and prod=‘2’ and espece=‘2’ and ...etc.. GROUP BY d_pesee,cd_pesee Pour avoir des résultats par date de pesées SELECT distinct d_pesee,count(*), avg(poids),min(poids),max(poids) and d_pesee between ’22-MAR-2013’ and ’10-OCT-2013’ GROUP BY d_pesee avg(col) : col doit être de type numérique sum : somme, var : variance, std : écart type
30
3.1.9 Having : filtre portant sur le résultat
Pour connaître les mères qui ont plus de 4 descendants : SELECT distinct mg_elv,mg_id_animal, count(*) FROM geedoc.Animal WHERE elv_ne=‘ ’ and espece=‘2’ and mg_campagne=‘2013’ and mg_saison=’1’ GROUP BY mg_elv,mg_id_animal HAVING count(*)>4 Pour savoir s’il n’y a qu’une Pesée de Mise Bas intra campagne/saison SELECT distinct elv_ne,id_animal, count(*) FROM geedoc.Pesee WHERE elv_prod=‘ ’ and prod=‘2’ and espece=‘2’ and campagne=‘2013’ and saison=’1’ and cd_pesee=‘11’ GROUP BY elv_ne,id_animal HAVING count(*)>1
31
3.1.10 Conditions : elv_prod, prod, espece
Repro elv_prod prod espece elv_ne id_animal campagne saison deb_saison n_travail lot_lutte groupe* sexe* MiseBas elv_prod prod espece elv_ne id_animal campagne saison d_misebas mod_mb portee groupe no_lact Present elv_prod prod espece elv_ne id_animal d_arrivee d_sortie elv_envoi Animal espece elv_ne id_animal d_nais sexe typ_gen ipg where elv_prod=‘ ’ and prod=‘2’ and espece=‘2’ where elv_ne=‘ ’ and espece=‘2’
32
A B ensembles 3.2 SQL : Requête sur plusieurs tables (jointures)
Lien A B ensembles La jointure se fait sur un ou plusieurs champs communs aux 2 tables Syntaxe1 Syntaxe2 SELECT A.col1,A.col2,B.col1 FROM geedoc.table1 A INNER JOIN geedoc.table2 B ON A.col1=B.col3 and A.col2=B.col4 WHERE .etc. FROM geedoc.table1 A, geedoc.table2 B WHERE A.col1=B.col3 and A.col2=B.col4 and .etc.
33
Jointures : notion d’ensemble
34
3.2.1 Jointure naturelle : INNER JOIN
Animal espece elv_ne id_animal d_nais sexe typ_gen lignee ipg Pesee elv_prod prod espece elv_ne id_animal d_pesee h_pesee Poids n 1 Table1 : A Table2 : B SELECT A.elv_ne,A.id_animal,A.d_pesee,B.ipg,B.typ_gen FROM geedoc.Pesee A INNER JOIN geedoc.Animal B ON A.id_animal=B.id_animal and A.elv_ne=B.elv_ne and A.espece=B.espece WHERE A.elv_prod=‘ ’ and A.prod=‘2’ and A.espece=‘2’ and B.sexe=‘2’ and B.typ_gen in (‘0010’,’0021’,’0401’)
35
3.2.1 Exemple : Jointure entre la table Repro et la table Animal
Elevé jeune Animal espece elv_ne id_animal d_nais sexe typ_gen d_repro ipg Repro elv_prod prod espece elv_ne id_animal campagne saison deb_saison sexe* lot_lutte Present elv_prod prod espece elv_ne id_animal d_arrivee d_sortie n 1 n 1 Déclarer apte à la reproduction Mise à la repro campagne/saison Un animal ne peut être déclaré Repro que s’il existe dans la table Present et donc dans la table Animal
36
3.2.1 Exemple : liste des femelles qui sont dans une campagne/saison
SELECT R.elv_ne,R.id_animal,R.campagne,R.saison,R.lot_lutte, A.d_nais,A.sexe,A.ty_gen,A.lignee,A.ipg // Je pars de la table Repro FROM geedoc.Repro R // Jointure avec la table Animal pour avoir les infos de chaque animal INNER JOIN geedoc.Animal A ON R.id_animal=A.id_animal and R.elv_ne=A.elv_ne and R.espece=A.espece // La condition peut porter sur les 2 tables WHERE R.elv_prod=‘ ’ and R.prod=‘2’ and R.espece=‘2’ and R.campagne=‘2013’ and R.saison=‘1’ and R.sexe=‘2’ (and A.sexe=‘2’) and A.typ_gen=‘0010’
37
3.2.2 Jointure externe : LEFT JOIN (ou RIGHT JOIN)
Table A Table B A1 A2 A3 P1 P3 P4 A1 P1 A3 P3 A1 P1 A2 A3 P3 A1 P1 A3 P3 P4 INNER JOIN LEFT JOIN RIGHT JOIN SELECT R.elv_ne,R.id_animal, R.campagne,R.saison,R.sexe,R.lot_lutte,L.d_male FROM geedoc.REPRO R // Jointure avec la table qui contient la définition des lots de lutte LEFT JOIN geedoc.Lot_Lutte L ON R.lot_lutte=L.lot_lutte and R.elv_prod=L.elv_prod and R.prod=L.prod and R.espece=A.espece and R.campagne=L.campagne and R.saison=L.saison WHERE R.elv_prod=‘ ’ and R.prod=‘2’ and R.espece=‘2’ and R.campagne=‘2013’ and R.saison=‘1’ LEFT JOIN : Liste de tous les animaux de la campagne/saison INNER JOIN : Liste des animaux qui sont dans un lot de lutte
38
3.2.2 Jointure externe : LEFT JOIN (pour avoir le Génotype) autre méthode
Present elv_prod prod espece elv_ne id_animal d_arrivee d_sortie Genotypes espece elv_ne id_animal genotype allele1 allele2 Animal espece elv_ne id_animal ipg typ_gen n 1 1 n SELECT P.elv_ne,P.id_animal,A.ipg,G.allele1, G.allele2 FROM geedoc.Present P LEFT JOIN geedoc.ANIMAL A ON P.id_animal=A.id_animal and P.elv_ne=A.elv_ne and P.espece=A.espece LEFT JOIN (SELECT elv_ne,id_animal,espece,allele1,allele2 FROM geedoc.GENOTYPES Where genotype=‘PRP‘ and espece=‘2’ ) G ON P.id_animal=G.id_animal AND P.elv_ne=G.elv_ne AND P.espece=G.espece WHERE P.elv_prod=‘ ’ and P.prod=‘2’ and P.espece=‘2’ and ..etc..
39
3.2.2 Jointure externe : LEFT JOIN (pour avoir deux Génotypes)
SELECT P.elv_ne,P.id_animal,A.ipg,G1.allele1||’/|| G1.allele2 as PRP, G2.allele1||’/|| G2.allele2 as CaseineAS1 FROM geedoc.Present P // Jointure avec la table Animal pour avoir le n° IPG LEFT JOIN geedoc.ANIMAL A ON P.id_animal=A.id_animal and P.elv_ne=A.elv_ne and P.espece=A.espece // Jointure une 1ère fois avec Genotypes pour avoir les allèles du génotype PRP LEFT JOIN (SELECT elv_ne,id_animal,espece,allele1,allele2 FROM geedoc.GENOTYPES Where genotype=‘PRP' and espece=‘2’) G1 ON P.id_animal=G1.id_animal AND P.elv_ne=G1.elv_ne AND P.espece=G1.espece // Jointure une 2ème fois avec la table Genotypes pour avoir les Caséines Alpha S1 Where genotype=‘CaseineAS1' and espece=‘2’) G2 ON P.id_animal=G2.id_animal AND P.elv_ne=G2.elv_ne AND P.espece=G2.espece // Critères de sélection WHERE P.elv_prod=‘ ’ and P.prod=‘2’ and P.espece=‘2’ and ..etc..
40
3.2.3 Auto-jointure : rappel des identifiants
IDENTITE ANIMAL élevage de naissance Identité naissance campagne saison Animal elv_ne id_animal Père Génétique pg_elv pg_id_animal pg_campagne pg_saison Mère Génétique mg_elv mg_id_animal mg_campagne mg_saison Mère Allaitante ma_elv ma_id_animal ma_campagne ma_saison Mère Porteuse mp_elv mp_id_animal mp_campagne mp_saison Clé primaire : sens pour optimiser id_animal,elv_ne, espece
41
3.2.3 Auto-jointure : avoir les infos du père
Identité du père = pg_elv,pg_id_animal,espece SELECT A.elv_ne, A.id_animal,A.ipg,A.typ_gen, A.pg_elv, A.pg_id_animal, PG.ipg as pg_ipg,PG.typ_gen as pg_typ // Pour l’exemple je pars de la table Animal FROM geedoc.Animal A // Pour avoir les infos du père génétique LEFT JOIN geedoc.Animal PG ON A.pg_id_animal=PG.id_animal and A.pg_elv=PG.elv_ne and A.espece=PG.espece // Conditions WHERE A.elv_ne=‘ ’ and A.espece=‘2’ and substr(id_animal,1,2)=‘12’ (and mg_campagne=‘2012’) INNER JOIN : ne prend que les animaux qui ont un père connu LEFT JOIN : prend tous les animaux
42
3.2.3 Auto-jointure : Pour avoir infos du père et de la mère
Id père = pg_elv, pg_id_animal,espece Id mère=mg_elv, mg_id_animal,espece SELECT A.elv_ne,A.id_animal,A.ipg,A.typ_gen A.pg_elv,A.pg_id_animal,PG.ipg as pg_ipg,PG.typ_gen as pg_typ, A.mg_elv,A.mg_id_animal,MG.ipg as mg_ipg,MG.typ_gen as mg_typ // Pour l’exemple je pars de la table Animal FROM geedoc.Animal A // Pour avoir les infos sur le Père Génétique LEFT JOIN geedoc.Animal PG on A.pg_id_animal=PG.id_animal and A.pg_elv =PG.elv_ne and A.espece=PG.espece // Pour avoir les infos sur la mère génétique LEFT JOIN geedoc.Animal MG on A.mg_id_animal=MG.id_animal and A.mg_elv =MG.elv_ne and A.espece=MG.espece // Conditions WHERE A.elv_ne=‘ ’ and A.espece=‘2’ and .etc.
43
3.2.4 Opération Union : on peut mélanger des torchons et des serviettes
Pour avoir les luttes naturelles ET les IA [et les Transferts d’Embryons] Select elv_ne, id_animal, d_saillie,h_saillie, typ_lutte,d_marque,d_fin_lutte,pg_elv,pg_id_animal From geedoc.LUTTE_NAT Where elv_prod=‘ ’ and prod=‘2’ and espece=‘2’ and campagne=‘2013’ and saison=‘1’ UNION Select elv_ne,id_animal,d_saillie,h_saillie, typ_seme, ‘’ as d_marque, ‘’ as d_fin_lutte,pg_elv,pg_id_animal From geedoc.IA [UNION Select .. From geedoc.Emb_Impl where …] Nombre de colonnes doit être le même Le type des colonnes doit être compatible
44
3.2.5 La Différence : minus Pour avoir les femelles qui ont été mise à la traite mais qui n’ont pas été traite à une date et un moment spécifiés. Select elv_ne, id_animal From geedoc.Mise_Traite Where elv_prod=‘ ’ and prod=‘1’ and espece=‘2’ and campagne=‘2014’ and (d_fin_traite IS NULL or (d_fin_traite IS not null and d_fin_traite>=‘10-FEB-2014’)) MINUS Select elv_ne,id_animal From geedoc.Traite_Anim and campagne=‘2014’ and d_traite=‘10-FEV-2014’ and moment=‘M’ Nombre de colonnes doit être le même Le type des colonnes doit être compatible
45
3.2.6 Le select imbriqué : femelles mises à la traite mais non traite
Select M.elv_ne,M.id_animal,A.ipg,M.d_debut_traite,M.d_fin_traite From geedoc.Mise_Traite M Left join geedoc.Animal A On M.id_animal=A.id_animal and M.elv_ne=A.elv_ne and M.espece=A.espece Where M.elv_prod=‘ ’ and M.prod=‘1’ and M.espece=‘2’ and M.campagne=‘2014’ and (M.elv_ne,M.id_animal,M.espece) NOT IN (Select TA.elv_ne,TA.id_animal,TA.espece FROM geedoc.Traite_Anim TA Where TA.elv_prod=‘ ’ and TA.prod=‘1’ and TA.espece=‘2’ and TA.campagne=‘2014' ) Un résultat retourné : = > >= < <= (select …) Plusieurs résultats retournés : IN (select …)
46
3.2.6 Le select imbriqué : autre exemple
SELECT R.elv_ne,R.id_animal,P.d_pesee,P.cd_pesee,P.poids FROM geedoc.Repro R INNER JOIN geedoc.Pesee P On R.id_animal=P.id_animal and R.elv_ne=P.elv_ne and R.espece=P.espece and R.campagne=P.campagne and R.saison=P.saison Where R.elv_prod=‘ ’ and R.prod=‘2’ and R.espece=‘2’ and R.campagne=’2013’ and R.saison=‘1’ and P.d_pesee=’20-JUL-2013’ and P.poids > (select avg(poids) FROM geedoc.Repro R On R.id_animal=P.id_animal and R.elv_ne=P.elv_ne and R.espece=P.espece and R.campagne=P.campagne and R.saison=P.saison Where R.elv_prod=‘ ’ and R.prod=‘2’ and R.espece=‘2’ and R.campagne=’2013’ and R.saison=‘1’ and P.d_pesee=’20-JUL-2013’ )
47
4- Applications - exemples
4.1 Repro + Pesée de Mise en Lutte + Pesée de Mise Bas 4.2 Saillies fécondantes campagne 2013 saison 1 4.3 Saillies fécondantes avec détails Lutte Naturelle et IA 4.4 IA fécondantes avec n°IPG de la mère et n° IPG du père 4.5 Traite des femelles d’une campagne, que pour les contrôles officiels
48
4.1 Exemple : Repro + Pesée de Mise en Lutte (10) + Pesée de Mise Bas (11)
Select R.elv_ne,R.id_animal,R.lot_Lutte,R.groupe, PL.d_pesee as d_lutte, PL.poids as pds_lutte, PM.d_pesee as d_mb, PM.poids as pds_mb From geegoc.Repro R // Jointure avec la table Pesée pour avoir la pesée de mise en lutte LEFT JOIN (SELECT elv_ne,id_animal,espece,campagne,saison,d_pesee,poids From geedoc.PESEE Where elv_prod=‘ ' AND prod=‘2' AND espece=‘2’ and campagne=‘2013’ and saison =‘1‘ and cd_pesee ='10') PL ON R.id_animal=PL.id_animal and R.elv_ne=PL.elv_ne and R.espece=PL.espece and R.campagne=PL.campagne and R.saison=PL.saison // Jointure avec la table Pesée pour avoir la pesée de mise bas Where elv_prod=‘ ' AND prod=‘2' AND espece=‘2’ and campagne=‘2013’ and saison =‘1‘ and cd_pesee ='11') PM ON R.id_animal=PM.id_animal and R.elv_ne=PM.elv_ne and R.espece=PM.espece and R.campagne=PM.campagne and R.saison=PM.saison // Critères de sélection Where R.elv_prod=‘ ’ and R.prod=‘2’ and R.espece=‘2’ And R.campagne=‘2013’ and R.saison=‘1’ and R.sexe=‘2’
49
4.2 Exemple : saillies fécondantes campagne 2013 saison 1
SELECT S.elv_ne,S.id_animal,A.ipg,S.d_saillie,S.h_saillie, R.lot_lutte,L.commentaire, Case When S.mod_saillie=‘1’ then ‘MN’ When S.mod_saillie=‘2’ then ‘IA’ When S.mod_saillie=‘3’ then ‘TE’ END AS mod_saillie // On part de la table Saillies From Geedoc.Saillies S // Jointure avec la table Repro pour avoir le lot_lutte LEFT JOIN geedoc.Repro R ON R.id_animal=S.id_animal and R.elv_ne=S.elv_ne and R.espece=S.espece and R.campagne=S.campagne and R.saison=S.saison // Jointure avec la table Lot_Lutte pour avoir le commentaire LEFT JOIN geedoc.Lot_Lutte L ON R.elv_prod=L.elv_prod and R.prod=L.prod and R.espece=L.espece and R.campagne=L.campagne and R.saison=L.saison and R.lot_lutte=L.lot_lutte // Jointure avec la table Animal pour avoir le N° IPG LEFT JOIN geedoc.ANIMAL A ON S.id_animal=A.id_animal and S.elv_ne=A.elv_ne and S.espece=A.espece // Conditions WHERE S.elv_prod=‘ ’ and S.prod=‘2’ and S.espece=‘2’ and S.campagne=‘2013’ and S.saison=‘1’ and S.utile=‘F’ (Saillies Fécondantes) and R.lot_lutte in (’01,’02’) and A.typ_gen=‘0010’
50
4.3 Exemple : Saillies fécondantes : Lutte Naturelle + IA
Select elv_ne, id_animal, d_saillie,h_saillie, typ_lutte, to_char(d_marque,’DD/MM/YYYY’) as d_marque, to_char(d_fin_lutte,’DD/MM/YYYY) as d_fin_lutte, ,pg_elv,pg_id_animal // On par de la table contenant les luttes naturelles From geedoc.LUTTE_NAT LN // Jointure avec la table Saillie pour ne prendre que les saillies fécondantes LEFT JOIN geedoc.SAILLIE S ON LN.id_animal=S.id_animal and LN.elv_ne=S.elv_ne and LN.espece=S.espece and LN.d_saillie=S.d_saillie and LN.h_saillie=S.h_saillie Where LN.elv_prod=‘ ’ and LN.prod=‘2’ and LN.espece=‘2’ and LN.campagne=‘2013’ and LN.saison=‘1’ and S.utile=‘F’ UNION Select elv_ne,id_animal,d_saillie,h_saillie, typ_seme, ‘’ as d_marque, ‘’ as d_fin_lutte,pg_elv,pg_id_animal // On part de la table contenant les IA From geedoc.IA LN and LN.campagne=‘2013’ and LN.saison=‘1’ and S.utile=‘F ’
51
4.4 IA fécondantes avec n°IPG femelle et n° IPG du mâle
Select IA.elv_ne,IA.id_animal,A.ipg,A.typ_gen,IA.d_saillie,IA.h_saillie, Case When IA.typ_seme=‘1’ then ‘IAF’ When IA.typ_seme=‘2’ then ‘IAC’ END AS typ_seme, IA.pg_elv,IA.pg_id_animal,P.typ_gen as pg_typ, P.ipg as pg_ipg // On part de la table IA From geedoc.IA IA // Jointure avec la table Saillie pour ne prendre que les saillies fécondantes Left join geedoc.SAILLIE S ON IA.id_animal=S.id_animal and IA.elv_ne=S.elv_ne and IA.espece=S.espece and IA.d_saillie=S.d_saillie and IA.h_saillie // Jointure avec la table Animal pour avoir les infos sur la femelle Left join geedoc.ANIMAL A ON IA.id_animal=A.id_animal and IA.elv_ne=A.elv_ne and IA.espece=A.espece // Jointure avec la table Animal pour avoir les infos sur le mâle Left join geedoc.ANIMAL P ON IA.pg_id_animal=P.id_animal and IA.pg_elv=P.elv_ne and IA.espece=P.espece // Critères Where IA.elv_prod=‘ ’ and IA.prod=‘2’ and IA.espece=‘2’ and IA.campagne=‘2013’ and IA.saison=‘1’ and S.utile=‘F’
52
4.5 Lait : Traite des animaux d’une campagne (que les CLO)
Select TA.elv_ne,TA.id_animal,A.ipg,A.lignee,MB.no_lact, TA.d_traite,TA.moment,TR.no_clo, TA.lot_traite,TA.place,TA.qte_lait, TA.no_ech,TA.tb,TA.tp,TA.ccs,TA.uree,TA.ano_labo // Je pars de la table Traite Animal From geedoc.Traite_Anim TA // Jointure avec la table Animal pour avoir le N° IPG et la lignée LEFT JOIN geedoc.Animal A On TA.id_animal=A.id_animal and TA.elv_ne=A.elv_ne and TA.espece=A.espece // Jointure avec la table MiseBas pour avoir le n° de lactation LEFT JOIN geedoc.misebas MB On TA.id_animal=MB.id_animal and TA.elv_ne=MB.elv_ne and TA.espece=MB.espece and TA.campagne=MB.campagne (pas de saison) // Jointure avec la table Chantier_Tr pour avoir le CLO LEFT JOIN geedoc.Chantier_Tr TR On TA.elv_prod=TR.elv_prod and TA.campagne=TR.campagne and TA.d_traite=TR.d_traite and TA.moment=TR.moment // Conditions Where TA.elv_prod=‘ ’ and TA.prod=‘1’ and TA.espece=‘2’ and TA.campagne=‘2014’ and TR.no_clo is not NULL
53
4.6 Pesé es : exemple avec des intervalles de dates
Select R.elv_ne,R.id_animal,A.ipg, P.d_pesee,P.h_pesee,P.d_pesee-A.d_nais as age, P.lot_pesee,P.cd_pesee, P.poids // Je pars de la table Repro From geedoc.Repro R // Jointure avec la table Animal pour avoir le N° IPG et la date de naissance LEFT JOIN geedoc.Animal A On R.id_animal=A.id_animal and R.elv_ne=A.elv_ne and R.espece=A.espece // Jointure avec la table Pesee LEFT JOIN geedoc.Pesee P On R.id_animal=P.id_animal and R.elv_ne=P.elv_ne and R.espece=P.espece and R.elv_prod=P.elv_prod and R.prod=P.prod // Conditions Where R.elv_prod=‘ ’ and R.prod=‘2’ and R.espece=‘2’ and R.campagne=‘2013’ and R.saison=‘1’ and R.sexe=‘2’ and P.nat_pesee = ‘3’ and P.d_pesee >=R.deb_saison and P.d_pesee <= R.deb_saison+150
54
5- Méthode Margau (Hélène Larroque et Hervé Lagant)
*--- DONNEES LAFAGE GEEDOC ---*; libname GEEDOC oracle user=sas_ora pass=sas_ora path="DGA5E" schema=GEEDOC ; *--- chantier de traite ---*; data chantier(keep=elv_prod d_traite moment campagne typ_chantier ctl_expe ctl_offi ctl_qual); set geedoc.chantier_tr; if ELV_PROD=' ' & CAMPAGNE in ('2010','2011','2012','2013'); run;
55
6 Les macros dans SaS %macro sqlrepro(elv_prod,prod,espece,campagne,saison); proc sql; connect to oracle (user=sasora password=sasora create table tab_repro as select elv_ne,id_animal,ipg,sexe,campagne,saison,lot_lutte from connection to oracle (select R.elv_ne,R.id_animal,A.ipg,R.sexe,R.campagne,R.saison,R.lot_lutte from geedoc.Repro R Left join geedoc.Animal A On R.id_animal=A.id_animal and R.elv_ne=A.elv_ne and R.espece=A.espece where R.elv_prod=&elv_prod and R.prod=&prod and R.espece=&espece and R.campagne=&campagne and R.saison=&saison order by id_animal,elv_ne); disconnect from oracle; %mend; fin de la macro %sqlrepro(‘ ’,’2’,’2’,’2013’,’1’); utilisation de la macro run;
56
7- Conclusions : résumé sur les jointures
57
7.1 Conseils sur les jointures :
Bien se poser la question ou les questions : qu’est-ce que je veux faire ? Essayer de ne pas travailler sur la table Animal en premier Bien spécifier votre élevage de production = domaine= UE : elv_prod=‘’ votre production : prod=‘1’ (Lait), prod=‘2’ (Viande) votre espèce : espece=‘1’ (Caprin), espece=‘2’ (Ovins) Pour avoir l’IPG , jointure avec la table Animal id_animal,elv_ne,espece Pour toutes les tables liées à la reproduction (repro,lutte_nat,ia,saillie,.etc.) : id_animal,elv_ne,espece,campagne,saison Pour les tables liées aux saillies : id_animal,elv_ne,espece,d_saillie,h_saillie
58
7.1.1 Jointures avec la table Animal
SELECT … FROM geedoc.REPRO R // Jointure avec la table animal sur la clé primaire de la table Animal // et dans ce sens pour optimiser les temps de réponses LEFT JOIN geedoc.Animal A on R.id_animal=A.id_animal and E.elv_ne=A.elv_ne and R.espece=B.espece // Ne prendre que les animaux de votre élevage, production et espèce WHERE R.elv_prod=‘…’ and R.prod=‘2’ and R.espece=‘2’ and R.campagne=‘2013’ and R.saison=‘1’
59
7.1.2 Jointures entre tables liées à la reproduction
SELECT … FROM geedoc.MISEBAS M // le lien se fait sur l’identifiant complet + campagne/saison LEFT JOIN geedoc.REPRO R ON M.id_animal=R.id_animal and M.elv_ne=R.elv_ne and M.espece=B.espece and M.campagne=R.campagne and M.saison=R.saison // Conditions votre élevage, production, espèce WHERE M.elv_prod=‘…’ and M.prod=‘2’ and M.espece=‘2’ and M.campagne=‘2013’ and M.saison=‘1’
60
7.1.3 Jointures entre tables liées aux saillies
SELECT … FROM geedoc.Lutte_Nat L // Le lien se fait sur l’identité complète + date et heure de saillie LEFT JOIN geedoc.Saillie S ON L.id_animal=S.id_animal and L.elv_ne=S.elv_ne and L.espece=S.espece And L.campagne=S.d_saillie and L.h_saillie=S.h_saillie WHERE L.elv_prod=‘…’ and L.prod=‘2’ and L.espece=‘2’ and L.campagne=‘2013’ and L.saison=‘1’
61
Plus d’infos Pour plus d’info : google SQL oracle
Attention aux normes : tous les SGBDR n’utilisent pas la même norme Pour SaS : regarder le .log s’assurer que le .profile est bon s’assurer que vous pouvez vous connecter à la base Pour de l’aide : Marie-Christine Batut Vous tous: Plan d’accouplement, divers programmes Connaitre les données : Voir le MCD Tout est sur la Forge : Projet Geedoc
62
Merci de votre attention …
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.