Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour,
J'essaie de créer une jointure qui échoue avec un code D à chaque chargement.
J'ai un fichier contenant une liste de dossiers avec plusieurs actions par dossier, mon but est de charger la dernière action de chaque dossier.
Je procède comme suit :
//Je charge le fichier complet
Actions:
LOAD *
FROM
Data\overall_actions\overall_qlikview_actions.200001.csv
(txt, codepage is 1252, embedded labels, delimiter is '|')
Where client_userid ='c0344' and wildmatch(actiontype,'TL*') ;
//je crée une table temporaire avec le numéro de dossier et la date de la dernière action.
Actions_tmp:
load
dossier as tmp_dos,
max(dte_end) as dte_dern_action
resident Actions group by dossier,dte_start;
// je réalise une jointure des deux tables
left join (Actions_tmp )
load dossier
resident Actions
ça charge...puis j'ai un message d'erreur Code D.
Actions << overall_qlikview_actions.200001 24 159 lignes récupérées
Actions_tmp << Actions 24 087 lignes récupérées
Actions 24 159 lignes récupérées
Quelqu'un peut il me dire ce qui ne va pas ? ou peut être me proposer une optimisation de ma démarche ?
D'avance merci
La jointure sert à relier deux ou plusieurs tables entre elles
Les jointures sur QlikView sont assez proches dans le concept que celles faites avec une base de données relationnelle
La différence au niveau de la syntaxe entre le SQL et QlikView c'est que sur QlikView les clés et les types de jointure ne sont pas renseignées dans un FROM ou dans un WHERE... QlikView considère que les champs de même nom doivent être reliés ensemble, et le type de jointure est précisé avant le LOAD de la deuxième table à relier avec la première
Ensuite comme sur une base de données relationnelle il y a des jointures externes (OUTER JOIN), internes (INNER JOIN), jointures gauche (LEFT JOIN); jointures droite (RIGHT JOIN)
Dans votre cas la question à se poser
-Est ce que je souhaite avoir la date de dernière action dans une table DOSSIERS où il y a une ligne par dossier
Si OUI pas besoin de jointures
Un simple
Dossiers:
Load
dossier,
max(dte_end) as dte_dern_action
resident Actions
group by dossier
;
suffit
DOSSIERS et ACTIONS vont automatiquement se relier entre elles par le champ "dossier" qui est commun
-Est ce que je souhaite avoir la date de dernière action dans la table ACTIONS où il y a une ligne par dossier et par action et dans ce cas la jointure se justifie pour créer le nouveau champ dte_dern_action dans la table ACTIONS
left join (Actions)
load
dossier,
max(dte_end) as dte_dern_action
resident Actions
group by dossier;
Sur QlikView, ca peut perturber au départ on peut créer un nouveau champ dans une table "x" en faisant un RESIDENT sur cette même table "x", et même à une granularité différente (dans notre cas on fait un group by)
Le choix des deux possibilités dépend de ce que vous souhaitez faire du champ dte_dern_action. Est ce que c'est fait pour l"utiliser (faire des calculs) avec la date de départ, est ce un simple attribut....Cela dépendra ainsi de la volumétrie, de la profondeur de l'arbre constituant votre modèle de données
Bonjour Marwen,
Actions_tmp:
load
dossier as tmp_dos,
max(dte_end) as dte_dern_action
resident Actions group by dossier,dte_start;
Vous demandez un regroupement sur le champ "dte_start" que vous n'utilisez pas ensuite dans le LOAD. Ca n'a pas l'air de gêner QlikView mais est ce vraiment utile ? Car pour le coup celà ne vous prend pas la date de dernière action pour un dossier donné...Il y aura autant de lignes qu'il y a de dte_start différente
Quand au left join même si la syntaxe a l'air bonne (si ce n'est le ";" après le resident Actions) celà créé une jointure avec un produit cartésien ! Le champ "dossier" n'existe plus dans la table "Actions_tmp"
Cette erreur de type "D" arrive quand QlikView fait une erreur interne lors d'un reload. Il n'y a pas de raisons particulières mais celà arrive souvent quand la mémoire est pleine ou sur un système lent ou déjà mis à contribution par d'autres programmes
Dans votre cas le produit cartésien qui créé plusieurs dizaines de millions de lignes doit en être la source
Cordialement
Bonjour Amaury,
Tout ce dont j'ai besoin c'est d'avoir une table avec, pour chaque dossier, la dernière action réalisée (une action par dossier).
Quelle serait la meilleure formule à utiliser pour réaliser une jointure basée sur le numéro de dossier ?
Je ne comprend pas très bien la syntaxe des jointures sur Qlikview .
D'avance merci.
Marwen
Bonjour Marwen,
Je n'ai pas lu votre problème en détail, mais j'ai posté hier soir une application qui présente les résultats des différentes jointures. Peut-être que celle-ci pourra vous être utile !
Martin Favier
La jointure sert à relier deux ou plusieurs tables entre elles
Les jointures sur QlikView sont assez proches dans le concept que celles faites avec une base de données relationnelle
La différence au niveau de la syntaxe entre le SQL et QlikView c'est que sur QlikView les clés et les types de jointure ne sont pas renseignées dans un FROM ou dans un WHERE... QlikView considère que les champs de même nom doivent être reliés ensemble, et le type de jointure est précisé avant le LOAD de la deuxième table à relier avec la première
Ensuite comme sur une base de données relationnelle il y a des jointures externes (OUTER JOIN), internes (INNER JOIN), jointures gauche (LEFT JOIN); jointures droite (RIGHT JOIN)
Dans votre cas la question à se poser
-Est ce que je souhaite avoir la date de dernière action dans une table DOSSIERS où il y a une ligne par dossier
Si OUI pas besoin de jointures
Un simple
Dossiers:
Load
dossier,
max(dte_end) as dte_dern_action
resident Actions
group by dossier
;
suffit
DOSSIERS et ACTIONS vont automatiquement se relier entre elles par le champ "dossier" qui est commun
-Est ce que je souhaite avoir la date de dernière action dans la table ACTIONS où il y a une ligne par dossier et par action et dans ce cas la jointure se justifie pour créer le nouveau champ dte_dern_action dans la table ACTIONS
left join (Actions)
load
dossier,
max(dte_end) as dte_dern_action
resident Actions
group by dossier;
Sur QlikView, ca peut perturber au départ on peut créer un nouveau champ dans une table "x" en faisant un RESIDENT sur cette même table "x", et même à une granularité différente (dans notre cas on fait un group by)
Le choix des deux possibilités dépend de ce que vous souhaitez faire du champ dte_dern_action. Est ce que c'est fait pour l"utiliser (faire des calculs) avec la date de départ, est ce un simple attribut....Cela dépendra ainsi de la volumétrie, de la profondeur de l'arbre constituant votre modèle de données
Pour vous mettre un peu dans le bain :
Je travaille sur un Dashboard qui affiche plusieurs types de données (facturation,clientèle,état des dossiers,etc)
Il y'a plusieurs chargements de millions de lignes avant d'arriver à cette étape.
Je souhaite ajouter la dernière action entreprise dans chaque dossier ainsi que sa date d'échéance (dte_dern_action + 15j). Pour ce faire, je dois d'abord charger une table avec :
Dossier (qui servira de clé pour joindre la présente table au reste des données),dte_dern_action,Action_name
Dans un premier temps, mon problème c'est que je n'arrive pas à avoir une ligne par dossier compte tenu du fait qu'il y'en y'a parfois des centaines par dossier.
Une fois que c'est fait, je dois encore relier cette table à l'ensemble des données.
Finalement j'ai réussi à atteindre (avec plus ou moins de précision) mon objectif avec ce script :
Actions:
LOAD *
FROM
Data\overall_actions\overall_qlikview_actions.200001.csv
(txt, codepage is 1252, embedded labels, delimiter is '|')
where client_userid= 'c0344';
Temp_Action:
Load
dossier,
max(dte_end) as dte_end
resident Actions
group by dossier ;
inner join (Temp_Action)
load distinct(dossier),dte_end,actionfr
resident Actions ;
drop table Actions
rename table Temp_Action to Actions
Je pense que en mettant Noconcatenate après le chargement de la table Actions permettra de te donner le meilleur résultat.
Actions:
LOAD *
FROM
Data\overall_actions\overall_qlikview_actions.200001.csv
(txt, codepage is 1252, embedded labels, delimiter is '|')
where client_userid= 'c0344';
Noconcatenate
Temp_Action:
Load
dossier,
max(dte_end) as dte_end
resident Actions
group by dossier ;
inner join (Temp_Action)
load
distinct(dossier),dte_end,actionfr
resident Actions ;
drop table Actions;
rename table Temp_Action to Actions
En effet
Merci !