Qlik Community

Groupe des Utilisateurs Francophones

Vous êtes francophone? Ce groupe est pour vous. Venez découvrir comment démarrer avec Qlik Sense et QlikView, poser vos questions et partager vos tutos et astuces avec les membres de notre communauté.

Highlighted
flochi75
Contributor III

Re: intevalmatch successifs

ouahou,

alors là, je pense à peu près saisir la logique, mais dans la réalisation je suis noyé...

comment créer la table link ?

et lier tout ça dansle bon sens ?

je te joins la dernière mouture de l'appli.

peux tu y jeter un coup d'oeil ?

sinon, je vais m'y replonger demain matin...

sfatoux72
Valued Contributor

Re: intevalmatch successifs

Bonjour,

Tu trouveras ci-dessous le script avec ta partie (j'ai commenté quelques lignes et ajouté quelques remarques identifiable par //COMMUNITY : ):

Remarques pour améliorer la lisibilité du script:

  • Nommer les tables
  • Pour les jointures :
    • Spécifier la table à joindre (même si par défaut c'est la table précédente)
    • Spécifier par commentaire les champs utilisés comme clé de jointure (ça évite de devoir comparer les champs des 2 tables pour identifier les champs avec le même nom)

Concernant le reste du script, je l'ai construit un peu à l'aveugle sans pouvoir tester. Je te laisse donc recharger et voir comment cela se comporte.

//COMMUNITY : Utiliser directement le bon nom
//CAL_CHAMBRES_BASE:
CAL_CHAMBRES:
load IterNo() + num('01/01/2008')-1 as CAL_DATE ,
month(IterNo() + num('01/01/2008')-1) as CAL_MOIS,
Year(IterNo() + num('01/01/2008')-1)as CAL_ANNEE,
day(IterNo() + num('01/01/2008')-1) as CAL_JOURS
AutoGenerate (1)
while 
IterNo() + num('01/01/2008')-1 <= num(Today());

REF_CHAMBRE:
load *,
if(left(NUUFUF,2)='65','MAS',
if(NUUFUF='7120' or NUUFUF='7128','USLD',
if(NUUFUF='7126', 'UHR',
if(left(NUUFUF,2)='89','EHPAD')))) as TYPE_UF,
year(DATNH01) as ANNEE_NAIS;
SQL SELECT DATNH01,
DENTSJL,
DNALMA,
DSORSJL,
"HEBERGE_POUR",
"LLI_NULLLL",
"LLI_PIE_NUPIPI",
"NCCLI_NUMECLI" as "IPP",
"NCCLI_NUMECLI" as "CLE_CP",
"NCH06_NORDHIS",
"NCH12_NORDHIS",
"NCPRE_PRESPRE",
NOM,
"NOM_NAISSANCE",
NUMEDOS,
NUMEDOS as CLEDATES,
NUMEDOS as CLEDOS,
NUMEDOS as CLEGIR,
NUMEDOS as CLEDMT,
NUMEPAR,
NUMESJR,
NUTELL,
NUUFUF,
PRENH04,
PRSCSJL,
SEXEH01,
TSDAPAR,
VISISJL
FROM
SIL.NCV_PRS
where NUUFUF>'6388' and NUUFUF<>'7020' and NUUFUF<>'8924';

//COMMUNITY : Spécifier avec quel table vous faite la jointure
left join
SQL SELECT
MOSOHO,
NUHOHO,
NUHOHO as CLEDOS
FROM MAL.HOS
where ANULHO<>'A' and ETATHO='H' and UFENHO>'6388' and UFENHO<>'7020' and UFENHO<>'8924';

//COMMUNITY : Spécifier avec quel table vous faite la jointure
left join
load *,
left(CODEPOSTAL,2) as DEPT;
SQL SELECT "CMN_COP_NCPOPO" as "CODEPOSTAL",
"NCCLI_NUMECLI" as "CLE_CP",
DERNH06
FROM SIL.NCH06
where VALIH06='O' and DERNH06='O';

//COMMUNITY : Nommer votre table
load
CLEDATES,
min(DENTSJL) as DATE_ENTREE,
min(year(DENTSJL)) as ANNEE_ENTREE,
max(if(len(MOSOHO)<>0,DSORSJL)) as DATE_SORTIE
resident REF_CHAMBRE group by CLEDATES;

GIR:
SQL SELECT CODEGIR,
DAEFGIR,
DAFIGIR,
DAVSGIR,
NUGIGIR,
NUHOGIR,
NUHOGIR as CLEGIR,
PRISGIR,
VGIRGIR
FROM MAL.GIR;


DMT:
load*,
if(COTASE='E6' or left(COTASE,1)=9, '-60ans','+60ans') as TarifAge,
if(COTASE='E+','EHPAD Hospi +72 h',
if(COTASE='E-' or COTASE='C-','EHPAD Hospi -72 h',
if(COTASE='EP' or COTASE='CP','EHPAD Présent',
if(COTASE='ER','EHPAD -Repas',
if(COTASE='E0','EHPAD Tarif nul',
if(COTASE='E6','EHPAD -60ans',
if(COTASE='9+','EHPAD -60ans +72 h',
if(COTASE='9-','EHPAD -60ans -72 h',
if(COTASE='9R','EHPAD -60ans -Repas',
if(COTASE='90','EHPAD -60ans Tarif nul')))))))))) as LIBDMT;

SQL SELECT COTASE,
COTASE as NUCTCTA,
DATESE,
DATSSE,
DMTSSE,
NUHOSE,
NUHOSE as CLEDMT
FROM MAL.SEJ
where NUUFSE>6500;


//COMMUNITY : Plus nécessaire car directement nommée de façon correcte
//CAL_CHAMBRES:
//NoConcatenate LOAD * Resident CAL_CHAMBRES_BASE;

//COMMUNITY : Remplacer par le code qui suit
//IntervalMatch (CAL_DATE) load DENTSJL, DSORSJL Resident REF_CHAMBRE ;

//COMMUNITY : Plus nécessaire car directement nommée de façon correcte
//drop Table CAL_CHAMBRES_BASE;


//COMMUNITY : Nouveau code
//*********************************************************
//* Ajout de CLELINK dans les tables de base
//*********************************************************
RENAME Field CLEDOS to CLEDOS_tmp;
RENAME Field CLEGIR to CLEGIR_tmp;
RENAME Field CLEDMT to CLEDMT_tmp;

// Ajout de CLELINK dans la table REF
Left join (REF_CHAMBRE)
LOAD
CLEDOS_tmp, // Clé de jointure
DENTSJL, // Clé de jointure
DSORSJL , // Clé de jointure
Autonumber('REF' & '_' &  CLEDOS_tmp & '_' & DENTSJL & '_' & DSORSJL  , 'CLELINK') AS CLELINK
Resident REF_CHAMBRE;

// Ajout de CLELINK dans la table GIR
Left join (GIR)
LOAD
CLEGIR_tmp, // Clé de jointure
DAEFGIR, // Clé de jointure
DAFIGIR, // Clé de jointure
Autonumber('GIR' & '_' &  CLEGIR_tmp & '_' & DAEFGIR & '_' & DAEFGIR , 'CLELINK') AS CLELINK
Resident GIR;

// Ajout de CLELINK dans la table DMT ==> ATTENTION les date de début sont identique au date de fin
Left join (DMT)
LOAD
CLEDMT_tmp, // Clé de jointure
DATESE, // Clé de jointure
  DATSSE, // Clé de jointure
Autonumber('DMT' & '_' &  CLEDMT_tmp & '_' & DATESE & '_' & DATSSE, 'CLELINK') AS CLELINK
Resident DMT;


//*********************************************************
//* Création de la table Link
//*********************************************************
Link:
LOAD
CLELINK,
CLEDOS_tmp  as CLEDOS,
DENTSJL  as DateDebut,
DSORSJL  as DateFin,
'REF'
as IntervalType
Resident REF_CHAMBRE;

Concatenate(Link)
LOAD
CLELINK,
CLEGIR_tmp  as CLEDOS,
DAEFGIR  as DateDebut,
DAFIGIR  as DateFin,
'GIR'
as IntervalType
Resident GIR;

Concatenate(Link)
LOAD
CLELINK,
CLEDMT_tmp  as CLEDOS,
DATESE  as DateDebut,
DATSSE  as DateFin,
'DMT'
as IntervalType
Resident DMT;


IntervalLink:
LOAD
CLELINK,
DateDebut as DateDebut_tmp,
DateFin as DateFin_tmp,
1
as NbJournée
Resident Link;

//*********************************************************
//* Création de la table IntervalLink
//*********************************************************
Left join(IntervalLink)
IntervalMatch (CAL_DATE)
LOAD Distinct DateDebut_tmp, DateFin_tmp
Resident IntervalLink;

DROP Fields DateDebut_tmp, DateFin_tmp;
DROP Fields DateDebut, DateFin;

flochi75
Contributor III

Re: intevalmatch successifs

Un grand merci pour tout ce travail, Sébastien;

Un pb persiste avec la table GIR, qui semble exclue , ainsi que la table DMT :

Capture.JPG

Capture2.JPG

sfatoux72
Valued Contributor

Re: intevalmatch successifs

Il me faudrait l'application chargée avec le nouveau script.

Comme je te l'ai dit ça a été fait à l'aveugle, donc je ne suis pas certain à 100% que nous ayons le résultat désiré.

flochi75
Contributor III

Re: intevalmatch successifs

ne t'inquiète pas, je ne te jette pas du tout la pierre , je te remercie pour le temps et la matière qrise que tu mets à ma disposition.

une idée comme ça : si on mets (est-ce possible) la clé correspondant aux NUHOHO dans le calendrier, et qu'on y fasse tous les intervalmatch ???

en tout cas, je te joins l'appli avec ton script ainsi que les 3 tables .

Merci

flochi75
Contributor III

Re: intevalmatch successifs

juste au cas ou, une illustration :

les données dispo sont les dates de début et de fin de chaque item (mouvement/tarif/GIR)

il me faut compter un nb de journées de présence par séjour/tarif/GIR...

Capture.JPG

sfatoux72
Valued Contributor

Re: intevalmatch successifs

J'ai chargé les QVD et j'ai appliqué un filtre pour ne pas reprendre les intervalle terminée avant la date de début du calendrier 01/01/2008.  Je te laisse appliqué ce filtre à tes extraction de la base de donnée si tu le désires.

Voici ton application avec un nouveau modèle qui correspond mieux à tes besoins.

Community_1200396_1.png

Je te laisserai regarder le script pour voir comment j'ai procédé.

J'ai remarqué que pour REF et DMT les date de début d'une intervalle correspondait exactement à la date de fin de l'intervalle précédente. Ceci n'est pas compatible avec l'IntervalMatch car les bornes sont comprises, donc si la valeur de fin d'intervalle correspondait à la valeur du calendrier, la journée serait comptée dans les 2 intervales.

J'ai donc réduit les dates de fin correspondante de moins d'une seconde pour éviter ce genre de problème.

==> Le Total DMT 2016 a diminué de 2.

flochi75
Contributor III

Re: intevalmatch successifs

Bonjour Sebastien,

un grand merci pour ce travail !

Quand je regarde ton modèle de données, je me dis que c'est ce que je voulais obtenir : chaque table ayant un lien sur mon calendrier maître, mais n'étant pas informaticien et en tant qu'autodidacte à l'utilisation de QVW, chaque tentative (faire une clé sur chaque table vers un calendrier unique, concaténer les 3 tables, ...) me générait des références circulaires ou me faisait tomber le système...

Quand je regarde le script, alors là je comprend en gros le principe, mais j'aurais été incapable de l'imaginer et le produire.

de plus, à la première lecture, la différence avec ton premier jet ne me saute pas aux yeux, mais je vais approfondir.

Bref, tout ça pour te dire merci, ça marche !

Florent

sfatoux72
Valued Contributor

Re: intevalmatch successifs

Bonjour,

Pourrais-tu mettre un "Helpfull" sur la réponse du  "24 janv. 2017 05:45" concernant l'expression avec l'Aggr

Merci

flochi75
Contributor III

Re: intevalmatch successifs

comment faire, je n'ai que "utile" dans les actions possibles...